新的 Go 程序员通常不知道或对基本的 go build 命令的作用感到困惑。
go build
和 go install
命令究竟做了什么构建以及它们将结果/输出放在哪里?
最佳答案
go
命令的作用取决于我们是为“普通”包还是为特殊的“main”
包运行它。
对于包裹
go build
构建您的包,然后丢弃结果。go install
构建然后安装你的 $GOPATH/pkg
目录中的包。对于命令(包main
)
go build
构建命令并将结果留在当前工作目录。go install
在临时目录中构建命令,然后将其移动到 $GOPATH/bin
。go build
?您可以将 packages 传递给 go build
,即您想要构建的包。您还可以从单个目录传递 .go
文件列表,然后将其视为指定单个包的源文件列表。
如果没有提供包(导入路径),则构建应用到当前目录。
一个导入路径可以包含一个或多个"..."
通配符(在这种情况下它是一个模式)。 ...
可以匹配任何字符串,例如net/...
匹配 net
包和位于其任何子文件夹中的包。命令
go build ./...
常用于在当前文件夹中构建包,所有包递归下来。在项目根目录中发出的这个命令会构建完整的项目。
有关指定包的更多信息,请运行 go help packages
。
Go 1.11 中引入了对 Go 模块的初步支持,从 Go 1.13 开始,模块成为默认模块。当 go
工具从包含 go.mod
文件(或当前文件夹的父文件夹之一)的文件夹运行时,go
工具以 module-aware 模式运行(传统模式称为 GOPATH 模式)。
In module-aware mode, GOPATH no longer defines the meaning of imports during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) and installed commands (in GOPATH/bin, unless GOBIN is set).
构建模块时,构建的内容由构建列表指定。构建列表最初只包含主模块(包含运行 go
命令的目录的模块),主模块的依赖被递归添加到构建列表中(依赖的依赖为也添加了)。
要了解更多信息,请运行 go help modules
。
基本上,您可以使用 go build
检查是否可以构建包(连同它们的依赖项),而 go install
也(永久)将结果安装在$GOPATH
的正确文件夹。
go build
将静默终止,如果无法构建/编译包,则会给您错误消息。
每当 go
工具安装一个包或二进制文件时,它也会安装它拥有的任何依赖项,因此运行 go install
还将安装您的程序所依赖的包(公开可用,“获取可获取”包),自动。
首先,阅读官方How to Write Go Code页面。
关于 go
工具的更多信息:Command go
您还可以通过运行以下命令获得更多帮助:
go help build
还值得注意的是,从 Go 1.5 开始 go install
还会删除由 go build
( source ) 创建的可执行文件:
If 'go install' (with no arguments, meaning the current directory) succeeds, remove the executable written by 'go build', if present. This avoids leaving a stale binary behind...
要完成该列表,go run
会将您的应用程序编译到一个临时文件夹中,并启动该可执行二进制文件。当应用程序退出时,它会正确清理临时文件。
受 Dave Cheney 的 What does go build build? 启发的问题
https://stackoverflow.com/questions/30612611/
相关文章:
android - 错误 - Android 资源链接失败(AAPT2 27.0.3 Daemon
unit-testing - 没有找到测试。确保已安装的测试发现器和执行器、平台和框架版本设置正确,
php - 错误构建 : fatal error: pcre. h:没有这样的文件或目录
visual-studio-2010 - 在每次编译时禁用 "output window"的显示
testing - 如何在不从命令行测试的情况下运行 sbt 汇编命令?
python - MANIFEST.in 在 "python setup.py install"上被
java - .NET 世界是否有 Maven 替代方案或端口?