Golang中`go build .`和`go build ...`的区别是什么?
Golang中go build .和go build ...的区别是什么?
macOS 10.14.6
go 1.15.5
有人能告诉我(我搜索过但没找到相关信息)使用 go build . 和 go build ... 构建包之间的区别吗?
我发现第一种方法似乎会静默执行,而第二种方法会触发大量可见的模块/依赖活动,并且迟早会崩溃。
我正在 http://github.com/Seklfreak/discord-image-downloader-go 这个包上尝试此操作。
更多关于Golang中`go build .`和`go build ...`的区别是什么?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的回复。我一定是记错了 ./… 的语法!我刚刚试了一下,它确实有效 😄
更多关于Golang中`go build .`和`go build ...`的区别是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
欢迎。能否请您将相应的帖子标记为解决方案?这是为了论坛的维护和归档目的。
这听起来是一个合理的解释,但在这个案例中,工作空间并没有子目录。确实,依赖项看起来像是在被递归下载… 我正在处理的包是 http://github.com/Seklfreak/discord-image-downloader-go。
你试过 ./... 吗?
斜杠非常重要。这意味着构建当前目录及其中的所有文件(包括递归解释)。
你需要这个,因为 main.go 与其依赖的源代码文件编码在同一个根目录中。
编辑:
命令应该类似于:
$ go build -o ./path/to/my/bin/myProgram ./...
carlca:
有人能告诉我(我搜索过但没找到相关信息)在使用
go build .和go build ...构建包时有什么区别吗?
单个点 (.) 表示仅当前目录,而三个点 (...) 表示当前目录 以及所有子目录(递归地)。
对于构建命令,你可能希望将你的可执行文件(那些 main.go)组织在它自己的包中,并坚持使用单个点 (.)。
对于单元测试,三个点 (...) 是有意义的,因为你希望测试项目中的所有包(包括子包)。
在Go语言中,go build . 和 go build ... 有本质区别,这解释了你在构建时观察到的不同行为。
主要区别
go build .
- 构建当前目录(
.)中的Go包 - 只编译当前目录下的Go文件
- 不会递归处理子目录
- 输出静默是因为只处理单个包
go build ...
- 构建当前目录及其所有子目录中的所有Go包
- 递归遍历所有子目录
- 会下载和构建所有依赖包
- 可能触发大量模块活动是因为它处理整个包树
示例说明
假设有以下目录结构:
project/
├── main.go
├── go.mod
├── pkg/
│ ├── utils.go
│ └── subpkg/
│ └── helper.go
└── cmd/
├── tool1/
│ └── main.go
└── tool2/
└── main.go
# 只构建当前目录的包
go build . # 只构建 project/ 目录下的包
# 构建当前目录及所有子目录的包
go build ... # 构建 project/, project/pkg/, project/pkg/subpkg/,
# project/cmd/tool1/, project/cmd/tool2/ 中的所有包
在你的项目中的具体表现
对于 discord-image-downloader-go 项目:
# 只构建主包
go build . # 仅构建当前目录的主程序
# 构建所有包(包括依赖)
go build ... # 会尝试构建:
# 1. 主程序包
# 2. 所有内部包(如果有)
# 3. 下载并构建所有依赖包
# 这可能导致模块下载和潜在的构建问题
为什么 go build ... 会崩溃
go build ... 可能失败的原因:
- 递归构建所有依赖:包括测试依赖和工具依赖
- 模块下载问题:可能遇到网络问题或版本冲突
- 平台不兼容:某些依赖可能不支持你的平台(macOS 10.14.6)
建议的构建方式
对于你的项目,应该使用:
# 构建主程序
go build .
# 或者明确指定主包
go build ./main.go
# 如果要构建所有命令(如果有多个)
go build ./cmd/...
go build ... 通常用于:
- 测试整个项目的构建
- CI/CD流水线中验证所有包
- 清理或验证项目结构
对于日常开发,go build . 或 go build ./path/to/main 是更合适的选择。

