我们最近将Golang引入了我工作的公司,但我们在推出时遇到了一个障碍,因为Go可以使用go get
命令从互联网上获取包。通常,当我们推出Java和Python时,我们能够通过将包指向我们的内部工件来限制开发人员可以从何处提取包。
因此,对于Python,我们可以通过将pip命令更改为从我们的内部工件中拉取来改变它们的拉取位置,而对于Java,我们可以更改它们的settings.xml和pom.xml以指向我们的内部包。
我知道,在开发过程中,你可以获取并将依赖项拉入本地,然后将它们编译成一个独立的二进制文件。我正在寻找的是一些机制,阻止人们走出去,从开放的互联网拉。
这样的东西存在于围棋中吗?我可以阻止人们上网和go get
'ing软件包吗?
任何帮助将不胜感激。
3条答案
按热度按时间gab6jxml1#
这取决于您对“推出”的定义,但通常有三个阶段:
1.开发-此时,除了将开发机器置于限制性代理或类似的技术措施之后之外,您无法阻止任意
go get
调用。1.部署-由于Go程序可以(应该)作为单个二进制文件部署,因此在部署期间根本不使用
go get
。1.构建部署工件-这可能是您的问题:
通常的方法是在 * 构建 * Go程序时不获取依赖项。相反,依赖项在 * 开发 * 期间获取,并使用vendoring(例如使用
dep
工具)成为源代码树的一部分。此时,构建步骤不再需要获取任何依赖项。选择允许哪些依赖项现在成为您的流程的其余部分,例如代码审查。
vlju58qv2#
如果你想禁止在你的电脑上使用golang工具,你可以一次性下载模块依赖项,然后拒绝对%GOPATH%(和%GOROOT%)下的递归目录的写权限。(使用
go env GOPATH
查找)阻止 * 其他 * 用户使用动态下载的模块并不容易,因为可以通过使用供应商/源代码包或手动设置%GOPATH%来规避。
cgyqldqp3#
你说的方式对我来说似乎模棱两可...你是希望 * 用户 * 永远无法获得模块,还是希望它用于自动构建?
我想说,不是大规模地防止模块下载,而是有两个重要的技术(可以结合使用)
贩卖
如果你只是想防止特定的构建阶段(比如Docker构建)这样做,那么让你的根模块有一个
vendor
文件夹。vendor文件夹的工作原理类似于node_modules
等,并且该vendor文件夹应该具有所有依赖项的文件夹结构。默认情况下,在较新的Go版本中(GO111MODULE=auto),供应商文件夹的存在会阻止获取依赖项。
如果你愿意,你可以将vendor文件夹提交到git,然后确保你的CI构建是稳定的,永远不要尝试获取模块。
特定依赖的GOPRIVATE
除了vendoring之外,如果您只想拥有一个“私有模块集”,或者您希望您的系统不访问公共注册表,您还有两个额外的选择:GOPRIVATE和GOPROXY env变量。
GOPRIVATE说“不要检查这些模块前缀的公共模块缓存”
例如,您可以设置env var
GOPRIVATE=mycompany.com/prefix,otherthing.com/prefix
GOPRIVATE不匹配的任何内容仍然会转到公共代理。
理论上你可以设置
GOPRIVATE=*
,尽管我发现这会让开发体验变得烦人。它可能在自动化构建和CI中很有用。此外,您可以使用GOPROXY完全阻止所有“public”调用以获取模块alternately set up your own caching proxy that also prevents outgoing calls on some patterns
我认为这是最接近你的artifactory例子。
我会提到Go更喜欢基于git的存储库,所以不需要运行自己的“工件代理”,你可以做一个拥有私有模块的预算版本(假设github org有私有存储库),比如:
GOPRIVATE=github.com/mycompany
,根本不需要工件服务器。