我有一个存储库,其中包含一组嵌套的go包,如下所示:
$GOPATH/src/
- mypackage/common/utils.go
- mypackage/app1/main.go
- mypackage/app2/main.go
...
它编译成几个二进制文件。为了发布,我正在交叉编译多种平台/archs(我反复使用不同的GOOS
和GOARCH
进行部署)。我试图将编译结果写入我选择的目录,但我正在与工具链进行斗争。
我可以:
GOBIN
和go install
(即不交叉编译):build +输出/somedir/bin #中的所有二进制文件--这在为我的本地架构编译时非常有用。GOBIN=/somedir/bin go安装mypackage/app1 mypackage/app2 mypackage/app3但不幸的是,GOBIN
与交叉编译e.g:Throws冲突:“当GOBIN被设置时不能安装交叉编译的二进制文件”GOBIN=/somedir/bin GOARCH=amdm64 GOOS=darwin go install mypackage/app1 mypackage/app2go build
和GOOS=X
和GOARCH=Y
,编译一个二进制文件cd / output / GOOS=darwin -386 bin/ && \GOOS=darwin GOARCH=386 go构建mypackage/app1 #,但是如果给定多个二进制文件,则没有输出。(如文档所示) GOOS=darwin GOARCH=386 go构建mypackage/app1 mypackage/app2当给go build
多个包时,它不再释放二进制文件--它只是检查代码是否编译。要发出所有二进制文件,我似乎必须对每个子包运行一次go build
,所以需要更长的时间,尤其是使用-a
构建时。
像这样使用go build
的另一个可能的问题是,它可能将二进制文件和中间结果混合在同一个工作区中的多个体系结构中。但也许那只是品味的问题。希望工具链能够为不同的体系结构保持缓存结果的分离。这在实践中是如何处理的?我是否应该将每个子包作为一个单独的包来对待,尽管它们共享共同的代码(然后并行构建它们是否安全)?
相关条款:
go build ./...
的行为与在一个构建命令中传递多个包相同,因此不输出二进制文件。线程也不包括交叉编译)发布于 2019-04-05 10:06:32
我将要提出的建议充其量只是一次黑客攻击,但如果您交叉编译容器或孤立的构建环境中的内容,它可能会对您有用。
您可以从install命令中删除GOBIN:
# I'm not on this platform, so this is a cross compile
GOOS=darwin GOARCH=amd64 go install mypackage/app1 mypackage/app2
假设您的包在$GOPATH/src/mypackage
中,上面的命令将安装这两个二进制文件:
$GOPATH/bin/darwin_amd64/{app1, app2}
和.a编译依赖文件:
$GOPATH/pkg/darwin_amd64/mypackage/{app1,app2,common}
如果您计划支持的所有平台在for循环中运行,那么这个过程的一个麻烦之处是,当您通过与本地体系结构匹配的GOOS=x GOARCH=y
(即不交叉编译)时,可执行文件将直接放在$GOPATH/bin/
中而不是$GOPATH/bin/x_y/
中。
(另一方面,包总是以$GOPATH/pkg/x_y/
结束,交叉编译与否)。
要确定您的本地架构,您可以按照这个答案中的步骤:https://stackoverflow.com/a/35669816/5556676。
模拟GOBIN=/foo/bin GOOS=x GOARCH=y go install mypackage/app{1,2,3}
的
更改$GOPATH
对何去何从安装写输出几乎没有影响。使用一些go命令(如go get
),您可以通过在$GOPATH
前面添加一个新组件来调整安装包的位置。但是在go 1.9中,go install
总是在包含要安装的包的bin/
文件夹中复制二进制文件,这是src/
的同级文件。
不使用GOBIN=/foo/bin
,您可以假装源文件位于/foo/src/mypackage
(您可以使用符号链接),然后执行GOPATH=/foo GOOS=x GOARCH=y go install mypackage/app{1,2,3}
。这将在/foo/bin
中放置二进制文件,因为我在上一段中描述了这种行为。
不过,从您期望的位置抓取二进制文件可能比在周围复制源树要简单得多。
https://stackoverflow.com/questions/55532868
复制相似问题