首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何快速构建/安装交叉编译的嵌套包?

如何快速构建/安装交叉编译的嵌套包?
EN

Stack Overflow用户
提问于 2019-04-05 10:00:32
回答 1查看 1.9K关注 0票数 1

我有一个存储库,其中包含一组嵌套的go包,如下所示:

代码语言:javascript
运行
复制
$GOPATH/src/
  - mypackage/common/utils.go
  - mypackage/app1/main.go
  - mypackage/app2/main.go
  ...

它编译成几个二进制文件。为了发布,我正在交叉编译多种平台/archs(我反复使用不同的GOOSGOARCH进行部署)。我试图将编译结果写入我选择的目录,但我正在与工具链进行斗争。

我可以:

  1. 在为我自己的体系结构编译时,结合GOBINgo 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/app2
  2. 对每个子包使用go buildGOOS=XGOARCH=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的另一个可能的问题是,它可能将二进制文件和中间结果混合在同一个工作区中的多个体系结构中。但也许那只是品味的问题。希望工具链能够为不同的体系结构保持缓存结果的分离。

这在实践中是如何处理的?我是否应该将每个子包作为一个单独的包来对待,尽管它们共享共同的代码(然后并行构建它们是否安全)?

相关条款:

EN

回答 1

Stack Overflow用户

发布于 2019-04-05 10:06:32

我将要提出的建议充其量只是一次黑客攻击,但如果您交叉编译容器或孤立的构建环境中的内容,它可能会对您有用。

您可以从install命令中删除GOBIN:

代码语言:javascript
运行
复制
# 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中,上面的命令将安装这两个二进制文件:

代码语言:javascript
运行
复制
$GOPATH/bin/darwin_amd64/{app1, app2}

和.a编译依赖文件:

代码语言:javascript
运行
复制
$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中放置二进制文件,因为我在上一段中描述了这种行为。

不过,从您期望的位置抓取二进制文件可能比在周围复制源树要简单得多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55532868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档