我试图在一个Go项目中打印一个直接依赖项列表,该项目有一个供应商目录:
go list -mod=readonly -m -f '{{ if not .Indirect }}{{ .Path }}{{ end }}' all据我所知,我必须使用-mod=readonly,因为go list拒绝报告基于供应商的部分信息。这在我的笔记本上有效,因为我可以访问私有回购github.com/monzo/argo-rollouts,但是在CI中它失败了:
go list -m: github.com/argoproj/argo-rollouts@v0.0.0-20220309162305-84c86ea52e8f (replaced by github.com/monzo/argo-rollouts@v0.0.0-20220309162305-84c86ea52e8f): version "v0.0.0-20220309162305-84c86ea52e8f" invalid: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /home/circleci/go/pkg/mod/cache/vcs/052bf06be1713582ba9f1144e9982b362ff355fec71675863c108f9cf5a00bb4: exit status 128:
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.为什么go list -mod=readonly需要访问私有回购?我没有提供-u。
另外,为什么在供应商模式下不能在本地获取这些信息呢?
编辑:我找到了一个以供应商模式将合格模块传递给go list -m的解决方案,但它涉及到解析只用于机器的不稳定供应商/Modes.txt文件。
% cat modules-that-provide-packages.awk
BEGIN {
mod = ""
}
# Remember the module
/^# / {
mod = $2
}
# Print the module if it provides a package
!/^# / {
print mod
}
% awk -f modules-that-provide-packages.awk vendor/modules.txt /
| sort -u \
| xargs go list -m -f '{{ if not .Indirect }}{{ .Path }}{{ end }}'发布于 2022-06-30 16:24:00
我认为答案是:go list -m不需要访问私有的repos,但是填充一个空的GOMODCACHE需要访问。
go list -m从以下任一方面获取模块信息:
GOMODCACHE,但这必须已经被填充。它在CI中是空的,所以Go将尝试从私有repos下载。因此出现了错误。vendor目录,但您必须提供特定的模块。go list -m all 在供应商模式下放弃.发布于 2022-06-30 13:12:55
GOPRIVATE设置为您的私有GitHub帐户链接(如CI脚本中的github.com/abc* ) git config --global url."https://${{ inputs.token }}:x-oauth-basic@github.com/<useraccount>".insteadOf "https://github.com/<useraccount>"go mod vendor来获取CI上的所有依赖项。https://stackoverflow.com/questions/72816128
复制相似问题