icz*_*cza 81 compilation build go
New Go程序员经常不知道或混淆基本的go build命令所做的事情.
构造go build和go 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 68116和CL 75473.请参阅此线程,我在此处参考.
什么
go build和go 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标准库中的软件包使用而不进行编译器优化.