我想了解在复习 go 模块和 vendor 目录时遇到错误的原因。显然,在主模块和 vendor 文件夹中具有相同的包会导致错误,我想了解原因。据我了解,如果有go.mod
go
甚至不应该检查 vendor
依赖项的文件夹。一旦我运行 go run ./main.go
我收到以下错误:
main.go:3:8: ambiguous import: found package test/testpkg in multiple directories:
/Users/mic4ael/dev/mine/something-in-go/testpkg
/Users/mic4ael/dev/mine/something-in-go/vendor/test/testpkg
但是,当 go build -mod=mod
时不会发生这种情况。用于构建二进制文件。我会很感激解释为什么会这样。GO111MODULE=""
$ tree
.
├── go.mod
├── main.go
├── test
├── testpkg
│ └── lib.go
└── vendor
└── test
└── testpkg
└── lib.go
去.modmodule test
go 1.15
main.gopackage main
import "test/testpkg"
func main() {
testpkg.Echo("Test")
}
vendor/test/testpkg/lib.gopackage testpkg
import "fmt"
func Echo(str string) {
fmt.Printf("From vendored package %s\n", str)
}
testpkg/lib.gopackage testpkg
import "fmt"
func Echo(str string) {
fmt.Printf("From internal pkg: %s\n", str)
}
最佳答案
有两个同名的包,这就是歧义。导入时 test/testpkg
它可以从项目本身或 vendor 目录中导入。
使用 go modules 不会改变 vendoring 行为。其实可以用go mod vendor
本地 vendor 模块。如果包出现在 vendor/
下它将从 vendor 的副本中使用,否则将从模块缓存中下载和使用。但是,如果您的项目中有一个与 vendor 下的包之一同名的包,则存在歧义。
关于go - 主模块和 vendor 目录提供的导入被标记为错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64758247/