N N*_*N N 6 dependencies go dependency-management go-modules
我的项目中有两个依赖项。
go.mod:
module github.com/test-org/test-repo
go 1.12
require (
github.com/foo/bar v1.0.0
github.com/raz/mataz v1.0.0
)
Run Code Online (Sandbox Code Playgroud)
运行后go mod download,这两个依赖项导致github.com/shared/dependency要下载两个不同版本的 a 。有趣的是github.com/shared/dependency包含子模块,例如:
dependency
-- go.mod
-- api
-- go.mod
Run Code Online (Sandbox Code Playgroud)
检查下载的模块显示两个版本已下载到我的本地机器:
ls ${GOPATH}/pkg/mod/github.com/shared:
[dir] dependency [dir] dependency@v1.1.0
Run Code Online (Sandbox Code Playgroud)
ls ${GOPATH}/pkg/mod/github.com/shared/dependency:
[dir] api@v1.2.0
Run Code Online (Sandbox Code Playgroud)
查看这些目录的内容:
${GOPATH}/pkg/mod/github.com/shared/dependency@v1.1.0:
v1.1.0 中整个 repo 的文件内容,包括api带有自己go.mod文件的文件夹。
${GOPATH}/pkg/mod/github.com/shared/dependency/api@v1.2.0:
apiv1.2.0中repo所在文件夹的文件内容,包括go.mod文件。
最后,我的.go文件中test-repo有以下设置:
package test-package
import (
"github.com/foo/bar"
)
func MyFunc() {...bar.NewBar()...}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行MyFunc(存在于其他地方)的测试时,我收到一条unknown import path...ambiguous import...错误消息。例如
go test github.com/test-org/test-repo/test-package -test.run=TestMyFunc -v:
unknown import path "github.com/shared/dependency/api": ambiguous import: found github.com/shared/dependency/api in multiple modules:
github.com/shared/dependency v1.1.0 (${GOPATH}/pkg/mod/github.com/shared/dependency@v1.1.0/api)
github.com/shared/dependency v1.2.0 (${GOPATH}/pkg/mod/github.com/shared/dependency/api@v1.2.0)
Run Code Online (Sandbox Code Playgroud)
错误指向import该行.go文件导入github.com/shared/dependency/api的github.com/foo/bar回购。鉴于有两个可用版本,它不知道api在我的本地${GOPATH}/pkg/mod文件夹中选择哪个:
${GOPATH}/pkg/mod/github.com/shared/dependency@v1.1.0/api${GOPATH}/pkg/mod/github.com/shared/dependency/api@v1.2.0有什么方法可以使该go test调用正常工作(解决依赖冲突)?我的两个依赖项都没有明确要求下载完整的shared/dependency@v1.1.0,但由于某种原因它被拉进来。如果不存在,它似乎可以解决问题。
这个问题竟然是依赖的一个被引用的一个版本,github.com/shared/dependency/api这是前走模块。
这导致 go 工具有一个github.com/shared/dependency/api对子模块的模块引用,但也github.com/shared/dependency导致了 pre-go-modules 版本的整个repo的黑盒导入。在这个例子中,这意味着v1.2.0有 go 模块(有一个go.mod文件),而v1.1.0没有。
go.mod将以下行添加到我的文件中可以解决该问题,并且此解决方案适用于我遇到此类冲突的多个依赖项:
replace (
github.com/shared/dependency => github.com/shared/dependency v1.2.0
)
Run Code Online (Sandbox Code Playgroud)
请注意,此解决方案仅有效,因为我们强制引用共享依赖项以使用启用了 go-module 的版本 (v1.2.0+)。
| 归档时间: |
|
| 查看次数: |
6522 次 |
| 最近记录: |