【问题标题】:How can I force go mod to accept a module that declares its path being different from its go.mod?如何强制 go mod 接受声明其路径与其 go.mod 不同的模块?
【发布时间】:2021-03-25 05:23:40
【问题描述】:

当我运行“go mod tidy”时,它会中断,因为我的项目导入的包使用路径“github.com/coreos/bbolt”导入另一个包,但是当它从该路径获取包时,它的 go.mod 说它路径是“go.etcd.io/bbolt”。

问题是导入包和导入包都是第三方包。我知道我可以编辑 go 模块缓存来修复它,但是当这些包的新版本可用时,它会真正修复它。

部分回显消息如下所示:

    github.com/coreos/etcd/client tested by
    github.com/coreos/etcd/client.test imports
    github.com/coreos/etcd/integration imports
    github.com/coreos/etcd/etcdserver imports
    github.com/coreos/etcd/mvcc/backend imports
    github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.5: parsing go.mod:
    module declares its path as: go.etcd.io/bbolt
            but was required as: github.com/coreos/bbolt

那么,我该如何解决或解决这种情况?

【问题讨论】:

    标签: go go-modules


    【解决方案1】:

    您可以使用replace directive 修复此解决方案

    只需添加:

    replace github.com/coreos/bbolt v1.3.5 => go.etcd.io/bbolt v1.3.5
    

    go.mod 文件的末尾

    【讨论】:

    • 如果可行,可以说是go 命令中的一个错误——我可能会在golang.org/issue/26904 中修复一个错误,它将解决这种“重命名模块”使用-case 更直接。 ?
    • a) 你是对的。问题是我怀疑这是否是bbolt 的临时更改,并且不想为此更改代码库。对于一个可靠的修复,更改导入路径是一个更好的解决方案 b)我也是 #26904 的长期追随者,因为你是维护者:祝你好运,谢谢
    【解决方案2】:

    不匹配的路径意味着您的依赖项 (github.com/coreos/etcd/mvcc/backend) 是针对旧版本的 bbolt 存储库编写的——该存储库早于 commit e65d4d


    我注意到github.com/etcd-io/etcd repo 中的current go.mod file 将其模块路径指定为go.etcd.io/etcd/v3

    因此,对您来说最可靠的修复可能是更新到该路径,您可以通过更改您的 import 语句以引用新的规范导入路径并运行 go mod tidy 来相应地更新您的依赖项来做到这一点:

    sed -i s,github.com/coreos/etcd,go.etcd.io/etcd/v3,g $(find . -name '*.go')
    go mod tidy
    

    除此之外,您可以明确选择与旧导入路径匹配的github.com/coreos/bbolt 版本。我注意到https://beta.pkg.go.dev/github.com/etcd-io/bbolt?tab=versions 中列出的该模块的最高版本是v1.3.3,而v1.3.4 似乎确实添加了a go.mod file with the updated path。因此,作为后备,您可以尝试:

    go get -d github.com/coreos/bbolt@v1.3.3
    

    这种方法的缺点是 v1.3.3 是行尾:在那之后您将无法引入错误修复,因为这些修复都在 go.etcd.io 路径中。

    【讨论】:

    • 顺便说一句:bbolt 在补丁版本中添加go.mod 文件就semantic versioning 而言并不是一个好的选择——添加go.mod 文件可以说是“添加[ing]功能”,而不是“向后兼容的错误 [修复]”。但这不是您或他们目前可以解决的问题。 ?
    【解决方案3】:

    您也可以在命令行中使用 replace 指令,例如:

    go mod edit -replace github.com/pselle/bar=/Users/pselle/Projects/bar
    

    More info in this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多