【问题标题】:Go module is found and replaced, But not required找到并替换了 Go 模块,但不是必需的
【发布时间】:2021-09-29 18:54:09
【问题描述】:

我在尝试构建我的 go 代码时遇到了一个奇怪的错误。

$ make install
go version go1.16 windows/amd64
bin/check_go_version 1.14.4
plugin/loader/preload.sh > plugin/loader/preload.go
go fmt plugin/loader/preload.go >/dev/null
go install "-asmflags=all='-trimpath=C:\Users\Deepak Dash\go\src'" "-gcflags=all='-trimpath=C:\Users\Deepak Dash\go\src'" -ldflags="-X "github.com/ipfs/go-ipfs".CurrentCommit=8f9a2b7-dirty" ./cmd/ipfs
cmd\ipfs\daemon.go:32:2: module github.com/ipfs/go-saas-endpoint provides package github.com/ipfs/go-saas-endpoint and is replaced but not required; to add it:
        go get github.com/ipfs/go-saas-endpoint
make: *** [cmd/ipfs/Rules.mk:37: cmd/ipfs-install] Error 1

我之前曾与 go.mods 合作过。我已经用本地模块替换了 GitHub 包。它正在检测本地包。

谢谢, 迪帕克冲刺

【问题讨论】:

    标签: go go-modules


    【解决方案1】:

    这是一个 Go 1.16 问题,目前在 golang/go issue 44529 进行调查

    包括Jay Conrod's comment:

    go mod tidygo get 可能都通过网络查找任何必需模块未提供的导入包。
    如果一个模块在本地被替换,go命令会先看那里,但我认为它可能仍然会去网络寻找模块路径的其他前缀。

    相反,您可以在替换该版本时对不存在的版本添加要求:

    go mod edit -require example.com/mod@v0.0.0-local -replace example.com/mod@v0.0.0-local=../local
    

    添加替换模块,即使左侧没有版本,也不会自动将该模块添加到构建列表中。
    如果是这样,go 命令将读取其go.mod 文件并应用其要求。这可能会影响其他模块的选定版本,即使被替换的模块没有提供任何包。

    Bryan C. Mills from Google adds:

    go mod tidy 如果可以添加替换模块,则绝不应该进行网络查找。 (见import.go#queryImp()

    另一方面,go get 将执行网络查找以识别真正的最新版本,并考虑您的替换 (query.go#Versions()),然后该版本将被替换而不是下载。
    这样做是为了让 go get 添加的最新版本始终与 go list -m [⋯]@latest 一致,并且(如果可能)您的 require 指令始终为下游消费者(如果有)指定有效版本,这样它们就不会中断当他们需要您的模块时。 (下游消费者不会选择你的替换指令,所以他们需要一个有效的版本。)

    如果您没有为相关存储库使用代理,则该查找可能涉及克隆上游存储库。所以这可能是一个相当昂贵的操作。 (注意,go 命令的官方发行版默认使用proxy.golang.org,但go 命令的Fedora fork 没有。)

    如果该网络查找失败,则 go get 也将回退到替换版本 (query.go#Latest())

    【讨论】:

    • 谢谢!!!有道理,昨天我更新了 go 到 1.16 版本,它开始崩溃了。
    • 总结一下:这是从 Go 1.16 开始默认更改为 -mod=readonly 的副作用。您的构建之前成功了,因为默认行为是 -mod=mod,这会导致 go build 根据需要隐式添加新需求。使用新的默认设置,您需要在构建之前明确地添加这些要求(例如使用go mod tidygo get)。
    • @bcmills 很好的总结。我会监控(github.com/golang/go/issues/44529,你在哪里留下你的评论),看看是否会有任何解决方案或演变来使用户的过渡(即“从 Go 1.16 开始更改为默认为 -mod=readonly”)更顺畅。
    • go get mycompany.com/path/to/module 为我修复了它。其他人更好地解释了它的原因,但关键是 go get 理解 go.mod 可能有一个相对的替换路径,并且当它实际上是本地的时会将其保留在本地。
    猜你喜欢
    • 2021-01-29
    • 2013-08-10
    • 2013-12-30
    • 2017-12-18
    • 2016-04-26
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多