go - go build 是什么意思? (去构建与去安装)

新的 Go 程序员通常不知道或对基本的 go build 命令的作用感到困惑。

go buildgo 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/

相关文章:

.net - 为什么 .NET 中不需要 Maven?

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 替代方案或端口?

jenkins - 使用 ‘H * * * *’ 而不是 ‘5 * * * *’ 均匀分布负载

testing - Gradle 测试依赖