背景
使用第三方依赖包,有自己的需求需要进行改造, 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.3
和 v0.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/ProjectA@v0.7.3
如果直接 go get github.com/My/ProjectA@v0.0.0-20201223033556-a6833765eebe
就会报如题所示的错误。
所以上面两个要求一定要满足:
- 在新项目中(非依赖的原始仓库,也非fork项目中)执行
go get
命令,因为这时 go get 可以自动索引 go.mod 文件 - get 的路径为 go.mod 文件 replace 前半部分指定的依赖项目,并且携带版本
~
go mod 到底还是官方出品,还是好用~