go mod replace 解决 fork 项目的引入问题(module declares its path as Axx, but was required as Bxx)

背景

使用第三方依赖包,有自己的需求需要进行改造, fork 之后进行了改造,然后推送到自己的项目中,再去进行构建的时候,报错如下:

module declares its path as Axx
	but was required as Bxx

意思是说,我的这个项目引入的依赖路径不对,因为依赖的项目本身是使用go mod进行依赖管理的,而我在 fork 之后项目在 gopath 中的路径已经发生了变更,两者不一致导致这个错误的出现。

个人开发,无论是bug、功能、公司私有仓库的一些原因,可能还是会遇上 fork 别人的项目,然后引入依赖这样的需求,故作记录。

命名/定义

这里我们使用go1.15,并且开启 GO111MODULE="on"

// fork 原项目地址
github.com/UserA/ProjectA
// fork 后项目地址
github.com/My/ProjectA
// 我们自己的项目地址
github.com/My/MyProject

规范约束

按照下面的路径和开发规范检查是否有需要变动的位置,按照规则修改即可

1. fork 后的项目的路径

/** 
* 项目按照新的项目路径,保存到新的 项目B 的路径下
*/
$GOAPTH/src/github.com/My/ProjectA

2. fork 之后的 go mod 文件无需变更

/**
* 虽然新项目 fork 之后本地保存的路径发生了变更,我们想当然的可能觉得 My/ProjectA 中的依赖的
* 路径就会发生变化,实际上我们不需要担心这里的 ProjectA 自己的引用找不到,虽然本地存放路径
* 发生了变更,但是还有 `go.mod` 文件来约束本项目的路径,索引项目B中自己的引用会自动根据
*  `go.mod` 文件中下面内容自己映射的.
*/
module  github.com/UserA/ProjectA
// 即就是:
// 原项目内的文件依赖项目内其它路径时,会把`当前路径`认作是`github.com/UserA/ProjectA` ,然后继续查找子路径
// 这样也就符合我们 `1` 中所说的规范,我们要按照fork后的项目路径保存项目文件

3. 新项目中使用引入依赖,然后使用 replace 进行替换

/**
* 参考下面的项目定义
*/
module github.com/My/MyProject

go 1.15

require (
	github.com/UserA/ProjectA v0.7.3
)

replace github.com/UserA/ProjectA v0.7.3 => github.com/My/ProjectA v0.0.0-20201223033556-a6833765eebe

上面第一行 module 是指定了本项目的 mod,require 中只有一行,是我们依赖的原始的仓库地址

之后 replace 前面指定的依旧是原始依赖,后面部分指定的是我们自己改造过的

关于这里的 v0.7.3v0.0.0-20201223033556-a6833765eebe 实际上是两种 go mod 版本的定义,v0.7.3 是使用 git tag 来定义的,v0.0.0-20201223033556-a6833765eebe 是使用默认前缀 v0.0.0 - 时间戳 - commitId 组成的。需要注意这里的时间戳是 UTC 时区!详细可以参考 => Go Module 版本规则

4. 在项目文件所在目录(即go.mod文件所在路径)使用 go get 下载包

这里其实就是在 $GOPATH/github.com/My/MyProject 目录下,使用 go get 下载包,并且下载的命令必须是依赖的原始包

go get github.com/UserA/[email protected]

如果直接 go get github.com/My/[email protected] 就会报如题所示的错误。

所以上面两个要求一定要满足:

  • 在新项目中(非依赖的原始仓库,也非fork项目中)执行 go get 命令,因为这时 go get 可以自动索引 go.mod 文件
  • get 的路径为 go.mod 文件 replace 前半部分指定的依赖项目,并且携带版本

~

go mod 到底还是官方出品,还是好用~

你可能感兴趣的:(Golang,golang,gomod)