新入门的GO程序员通常不知道GO BUILD命令的基本功能,或者对此感到困惑.

go buildgo install命令究竟构建了什么?它们将结果/输出放在哪里?

推荐答案

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

For packages

  • go build  构建您的包,然后构建discards the results.
  • go install构建$GOPATH/pkg目录中的包,然后构建installs.

For commands (package 100)

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

What to pass to go build?

你可以通过packagesgo build个你想要构建的包.您还可以传递来自单个目录的.go个文件的列表,然后将其视为指定单个包的源文件列表.

如果未提供包(导入路径),则在当前目录上应用构建.

导入路径可以包含一个或多个"..."个通配符(在这种情况下,它是pattern)....可以匹配任何字符串,例如net/...匹配net包和它的任意子文件夹中的包.该命令

go build ./...

通常用于构建当前文件夹中的包和向下递归的所有包.在项目根目录中发出的此命令将构建完整的项目.

有关指定包的更多信息,请运行go help packages.

关于模块

GO 1.11中引入了对GO模块的初步支持,从GO 1.13开始,模块成为默认模块.当从包含go.mod文件的文件夹(或当前文件夹的父文件夹之一)运行go工具时,go工具在module-aware模式下运行(传统模式称为GOPATH mode).

在模块感知模式中,GOPATH不再定义导入的含义 在构建期间,但它仍然存储下载的依赖项(在GOPATH/pkg/mod中) 和已安装的命令(在GOPATH/bin中,除非设置了Gobin).

构建模块时,构建的内容由build list指定.构建列表最初只包含主模块(包含运行go命令的目录的模块),并且主模块的依赖项以递归方式添加到构建列表中(依赖项的依赖项也会添加).

有关更多信息,请运行go help modules.


基本上,您可以使用go build来判断包是否可以构建(以及它们的依赖项),而go install还(永久地)将结果安装到$GOPATH的正确文件夹中.

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

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

首先,请阅读官方的How to Write Go Code页.

有关go工具的更多信息:Command go

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

go help build

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

如果‘Go install’(不带参数,表示当前目录) 如果成功,则删除由"Go Build"编写的可执行文件(如果存在).这样可以避免留下陈旧的二进制文件.

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

问题灵感来自戴夫·切尼的What does go build build?

Go相关问答推荐

获取k8s群集作用域运算符的命名空间

Go-Colly:将数据切片为POST请求

[0]Func()as";请勿比较哨兵类型

go mod tidy会自动升级go.mod中的go版本吗?

Azure golang SDK - 将 AcrPull 角色分配给 AKS 群集

将字符串格式的x509证书生成主题名称

从 eBPF LRU 哈希映射中错误驱逐的元素

我在 go 中制作的递归函数有什么问题?

Go泛型:无效的复合文字

Wire google Inject with multi return from provider 函数

如何使用 go-playground/validator 编写 snake case 绑定标签?

每次有人进入我的网站时如何运行特定功能?

如何在没有内存分配的情况下压缩和发布文件

使用 `didip/tollbooth` 限制每小时最大请求数

Go 并发、goroutine 同步和关闭通道

Golang prometheus 显示自定义指标

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

gorm 获取列名

如何从 tinygo webassembly 目标返回对象

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string