go - 主模块和 vendor 目录提供的导入被标记为错误

标签 go go-modules govendor

我想了解在复习 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
去.mod
module test

go 1.15
main.go
package main

import "test/testpkg"

func main() {
    testpkg.Echo("Test")
}
vendor/test/testpkg/lib.go
package testpkg

import "fmt"

func Echo(str string) {
    fmt.Printf("From vendored package %s\n", str)
}
testpkg/lib.go
package 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/

相关文章:

go - 使用 Go 模块在包中组织本地代码

govendor 不导入较新的版本

go - 使用 Go 模块时如何 checkin 包?

templates - 在你的 go 二进制文件中包含模板/html 文件

json - 如何解码不同数据类型的 JSON 数组?

go - 获取 go 模块问题

go - 运行 dep 时出错确保 : Grouped write of manifest, 锁和 vendor :无法统计 VerifyVendor 声称存在的文件

go - 如何获得一天中的秒数

go - 如何获取第二天的具体时间

Go 项目不从 github 中提取导入更新