什么构建构建?

时间:2015-06-03 06:39:22

标签: go build compilation

New Go程序员经常不了解或混淆基本的go build命令所做的事情。

go buildgo install命令到底构建了什么以及它们将结果/输出放在何处?

2 个答案:

答案 0 :(得分:79)

go命令的作用取决于我们是否为#"正常"包或特殊"main"包。

对于软件包

  • go build  构建您的包,然后丢弃结果
  • go install构建在<{1}}目录中安装包。

对于命令(包$GOPATH/pkg

  • main构建命令并将结果保留在当前工作目录中。
  • go build  在临时目录中构建命令,然后将其移至go install

基本上,您可以使用$GOPATH/bin检查是否可以构建软件包(及其依赖项),而go build也(永久)将结果安装在{{1}的正确文件夹中}。

如果一切正常,

go install将默默终止,并且如果无法构建/编译软件包,则会给出错误消息。

每当$GOPATH工具安装包或二进制文件时,它也会安装它所具有的任何依赖项,因此运行go build也会安装程序所依赖的程序包(公开可用,&#34; go gettable& #34;包),自动。

首先,请阅读官方How to Write Go Code页面。

有关go工具的更多信息:Command go

您还可以通过运行以下命令获得更多帮助:

go install

值得注意的是,从Go 1.5开始go也会删除go help build source)创建的可执行文件:

  

如果安装&#39; (没有参数,意味着当前目录)   成功,删除由&#39; go build&#39;编写的可执行文件,如果存在的话。这样可以避免让陈旧的二进制文件落后......

要完成列表,go install将您的应用程序编译到一个临时文件夹中,然后启动该可执行二进制文件。当应用程序退出时,它会正确清理临时文件。

问题灵感来自Dave Cheney的What does go build build?

答案 1 :(得分:13)

包装:

  

go build:构建您的包,然后丢弃结果

在Go 1.10(2018年第一季度)之后,这不会成为现实,感谢CL 68116CL 75473。请参阅我在此引用的this thread

  
    

go buildgo install命令构建的确切内容

  
     

每当go工具安装一个包或二进制文件时,它也会安装它所拥有的任何依赖项,因此运行go install也会安装程序所依赖的程序包(公开可用,&#34; go gettable&#34; packages),自动

实际上... go install也会随着新缓存的Go 1.10,以及而改变:

  

&#34; go install&#34;命令不再安装命名包的依赖关系CL 75850)。

     

如果您运行&#34; go install foo&#34;,则唯一安装的是foo

     

之前,它变化多端。如果依赖关系已过时,&#34; go install&#34;还安装了任何依赖项   在&#34; go install&#34;期间隐式安装依赖项。给用户带来了很多困惑和麻烦,但以前需要启用增量构建   不再是。
  我们认为新的&#34; install what I said&#34;语义将更容易理解,特别是因为许多用户已经预料到它们的错误报告很清楚。   要在&#34; go install&#34;期间强制安装依赖项,请使用新的&#34; go install -i&#34; ,类似于&#34 ; go build -i&#34;和&#34; go test -i&#34;。

     

&#34; go install&#34;用于安装任何重建的依赖项,通常与-a一起引起混淆,这意味着&#34; force rebuild of all dependencies&#34;。
  现在,&#34; go install -a myprog&#34;将强制完全重建myprog的所有依赖项,以及myprog本身,但只会安装myprog。 (当然,所有重建的依赖项仍将保存在构建缓存中。)
  使这个案例工作更容易理解,与新的基于内容的陈旧性分析相结合尤其重要,因为它认为很好的理由比以前更频繁地重建依赖关系,这会增加&#34;为什么我的依赖关系得到安装& #34;混乱。
  例如,如果你运行&#34; go install -gcflags=-N myprog&#34;,它会安装一个没有编译器优化的myprog,但它不再重新安装从myprog使用的包没有编译器优化的标准库。