什么构建构建?

icz*_*cza 81 compilation build go

New Go程序员经常不知道或混淆基本的go build命令所做的事情.

构造go buildgo install命令的确切内容以及它们将结果/输出放在何处?

icz*_*cza 97

go命令的作用取决于我们是为"普通"包还是为特殊"main"包运行它.

对于包裹

  • go build  构建您的包然后丢弃结果.
  • go install然后,build 在您的$GOPATH/pkg目录中安装该软件包.

对于命令(包main)

  • go build  构建命令并将结果保留在当前工作目录中.
  • go install在临时目录中构建命令,然后将其移动到$GOPATH/bin.

基本上你可以用来go build检查包是否可以构建(以及它们的依赖项),go install同时(永久)将结果安装在你的正确文件夹中$GOPATH.

go build 如果一切正常,它将默默终止,如果无法构建/编译包,将会给出错误消息.

每当go工具安装包或二进制文件时,它也会安装它所具有的任何依赖项,因此运行go install时还会自动安装程序所依赖的程序包(公开可用,"go gettable"程序包).

首先,阅读官方如何编写Go Code页面.

有关该go工具的更多信息:命令go

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

go help build
Run Code Online (Sandbox Code Playgroud)

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

如果'go install'(没有参数,意味着当前目录)成功,则删除由'go build'写的可执行文件(如果存在).这避免了陈旧的二进制文件落后......

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

问题灵感来自Dave Cheney的构建版本是什么?


Von*_*onC 14

包装:

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

在Go 1.10(2018年第一季度)之后,这将是不正确的,感谢 CL 68116CL 75473.请参阅此线程,我在此处参考.

什么go buildgo install命令构建

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

实际上...... 除了新的缓存,go installGo 1.10也会改变:

" go install"命令不再安装命名包的依赖项(CL 75850).

如果你运行" go install foo",唯一安装的是foo.

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

" go install"用于安装任何重建的依赖项的事实最常引起混淆-a,这意味着" force rebuild of all dependencies".
现在," go install -a myprog"将强制完全重建所有依赖项myprog,以及它myprog自身,但只会myprog安装.(当然,所有重建的依赖项仍将保存在构建缓存中.)
与新的基于内容的过期分析相结合,使这种情况更容易理解是非常重要的,因为它看到了比以前更频繁地重建依赖项的充分理由,这会增加"为什么我的依赖关系得到安装"的混乱.
例如,如果运行" go install -gcflags=-N myprog",则安装myprog没有编译器优化的内置版本,但它不再重新安装myprog标准库中的软件包使用而不进行编译器优化.