2015-06-03 106 views
31

新的Go程序员经常不知道或者不知道基本的go build命令做了什么。构建构建是什么?

确切地说,go buildgo install命令是什么构建的?它们在哪里放置结果/输出?

回答

45

go命令的作用取决于我们是将其运行于“普通”软件包还是特殊的"main"软件包。

对于包

  • go build  建立你的包,那么丢弃结果
  • go install builds然后安装该包在您的$GOPATH/pkg目录中。

对于命令(包main

  • go build  构建命令并离开结果在当前工作目录
  • go install在临时目录中生成命令,然后将其移至$GOPATH/bin

基本上你可以使用go build作为检查该包可建(连同它们的依赖),同时也go install(永久)安装在您的$GOPATH的正确文件夹中的结果。

go build将静静地终止,如果一切正常,并会给你错误消息,如果包不能建立/编译。

每当go工具安装包或二进制文件,也安装任何依赖它,所以运行go install还将安装软件包程序取决于(公之于众,“去gettable”包),自动。

首先,请阅读官方How to Write Go Code页面。有关go工具

的更多信息:Command go

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

go help build 

还值得一提的是,开始进入1.5 go install还删除创建可执行文件通过go buildsource):

如果'去安装'(没有参数,意味着当前目录) 成功,请删除由'go build'编写的可执行文件(如果存在)。这避免了遗留一个陈旧的二进制文件......

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

问题由Dave切尼的What does go build build?

+1

似乎很奇怪,安装不会更新可执行文件,如果它与以前安装的可执行文件相同...任何见解? –

4

激发了包:

go build:建立你的包,那么丢弃结果

转到后这不会是真的1.10(Q1 2018),感谢CL 68116CL 75473。见this thread,我在这里引用。

什么完全go buildgo install命令建立

每当去工具安装包或二进制文件,也安装有任何依赖性,因此运行去安装也将安装软件包你程序依赖于(公开可用,“去获取”包),自动。

其实... go install将在新的缓存另外与围棋1.10,也随之变化:

的 “go install” 命令不再安装命名包的依赖(CL 75850 )。

如果您运行“go install foo”,则唯一安装的是foo

之前,它有所不同。如果依赖关系过时,“go install”也安装了任何依赖项。
在“go install”期间隐式安装依赖关系给用户造成了很多困惑和麻烦,但之前需要启用增量构建。
不再。
我们认为新的“install what I said”语义会更容易理解,特别是因为从错误报告中可以清楚地看到许多用户已经预料到它们。
要强制安装依赖的过程中“go install”,用“go build -i”和“go test -i”使用新的“go install -i,触类旁通。

其用于安装任何重修依赖性“go install”结合引起混乱最常与-a,这意味着“force rebuild of all dependencies”事实。
现在,“go install -a myprog”将强制完全重建所有依赖关系myprog以及myprog本身,但只会安装myprog。(当然,所有重建的依赖关系仍然会保存在构建缓存中)。
使这个案例更容易理解对于结合基于内容的新过时分析特别重要,因为它看到了更经常重建依赖关系的充分理由比以前,这会增加“为什么我的依赖安装”的混乱。例如,如果运行“go install -gcflags=-N myprog”,则安装不带编译器优化构建的myprog,但它不再从没有编译器优化的标准库中重新安装包的使用myprog

相关问题