New Go程序员经常不了解或混淆基本的go build命令所做的事情。
go build
和go install
命令到底构建了什么以及它们将结果/输出放在何处?
答案 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 68116和CL 75473。请参阅我在此引用的this thread。
go build
和go 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
使用的包没有编译器优化的标准库。