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

6 回复

感谢您的回复。我一定是记错了 ./… 的语法!我刚刚试了一下,它确实有效 😄

更多关于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 ... 可能失败的原因:

  1. 递归构建所有依赖:包括测试依赖和工具依赖
  2. 模块下载问题:可能遇到网络问题或版本冲突
  3. 平台不兼容:某些依赖可能不支持你的平台(macOS 10.14.6)

建议的构建方式

对于你的项目,应该使用:

# 构建主程序
go build .

# 或者明确指定主包
go build ./main.go

# 如果要构建所有命令(如果有多个)
go build ./cmd/...

go build ... 通常用于:

  • 测试整个项目的构建
  • CI/CD流水线中验证所有包
  • 清理或验证项目结构

对于日常开发,go build .go build ./path/to/main 是更合适的选择。

回到顶部