2 回答
TA贡献1818条经验 获得超8个赞
如果你不小心发布了一个你打算私有的包/模块,那么go.dev: About页面:
删除一个包
如果您想删除某个包,请发送电子邮件至
go-discovery-feedback@google.com
,并附上您要删除的导入路径或模块路径。
但正如 Adrian 在评论中提到的,不能保证没有人下载您发布的软件包。
如果您希望某些包/模块保持私有,您可以在 go 工具尊重的环境变量GOPRIVATE
中GONOPROXY
枚举它们(使用 glob 模式)。GONOSUMDB
GOPRIVATE, GONOPROXY, GONOSUMDB Comma-separated list of glob patterns (in the syntax of Go's path.Match) of module path prefixes that should always be fetched directly or that should not be compared against the checksum database. See 'go help module-private'.
从命令go help module-private
:
GOPRIVATE 环境变量控制 go 命令认为哪些模块是私有的(不公开),因此不应使用代理或校验和数据库。该变量是以逗号分隔的模块路径前缀的 glob 模式列表(在 Go 的 path.Match 的语法中)。
这些变量也可以使用go env -w
命令设置。您可以使用go help env
.
TA贡献1842条经验 获得超12个赞
对于问题2,我今天尝试了几次。如果你想安全地构建一个私有包,你应该做的最重要的事情是GOPRIVATE
在你构建你的包之前设置。并且GONOPROXY
,GONOSUMDB
将自动设置为与 相同GOPRIVATE
。现在你可以编写代码并写入git push
一个私人远程仓库并尝试go get
它,你会失败并看到一些类似的错误消息:
致命:无法读取“ https://github.com ”的用户名:终端提示已禁用 确认导入路径输入正确。如果这是一个私有存储库,请参阅https://golang.org/doc/faq#git_https了解更多信息。
https
该链接向我们表明,如果您将密钥上传到远程 ropo ,我们应该使用带有您的用户名/密码的链接,或者只需将您的 https 链接替换为 ssh 链接。完成后,你go get
将从你的源地址(你的包名)而不是代理成功。
Futhurmore,让我们通过 usinggo clean -modcache
和 set删除所有 go 模块缓存GOPRIVATE=""
。我将测试我们的私有包是否已上传到代理。
案例1:设置GOPROXY="https://goproxy.io"
或其他代理,然后go get
是私有包。你将面临一个404 Not Found
向你表明你从代理中找不到任何东西(这意味着没有任何东西被缓存/存储在代理中)。
案例2:设置GOPROXY="direct"
(使用你的包名的直接地址),然后go get
是私有包。你会面临这样的错误信息:
验证 {PACKAGENAME}:{PACKAGENAME}:初始化 sumweb.Conn:检查树#{ID}:获取https://sum.golang.org/tile/8/2/000.p/11:拨打 tcp {IP}: {PORT}:I/O 超时。
该go get
函数将尝试使用您的包检查来自 golang.org 数据库的校验和(我无法直接链接到谷歌服务器,因此它显示超时错误/我猜如果你可以链接到谷歌服务器,你将得到 404)。它表明,如果我们尝试go get
使用未设置的私有包GOPRIVATE
,您将失败,因为您无法通过检查。
建议:如果你想构建你的私有 go 包,你应该GOPRIVATE
首先设置你的包,并确保它足够宽以包含你的包名。
感谢大家阅读和回答这个问题。
- 2 回答
- 0 关注
- 240 浏览
添加回答
举报