如何通过一条命令同时安装 Go 项目中的可执行文件与库?

使用 go get github.com/myproject/demo/... 可递归获取并安装仓库中所有子目录下的可执行程序(含 main 包)及可导入库,无需分别执行多次 go get。

在 Go 模块时代(Go 1.11+),go get 默认以模块为单位进行依赖管理。当你的项目结构如下时:

github.com/myproject/demo/
├── config/      # 可导入库(package config)
├── crypto/      # 可导入库(package crypto)
├── demo/        # 可执行目录(package main)
│   └── executable.go
├── demo.go      # 主库入口(package demo)
├── deps.go
├── LICENSE
└── README.md

若仅运行 go get github.com/myproject/demo,Go 默认只处理根目录(即 demo.go 所在路径)的包——由于该目录是 package demo(非 main),它只会被下载并缓存为依赖库,不会构建或安装二进制文件

✅ 正确做法:使用通配符 ...

go get github.com/myproject/demo/...

该命令会递归遍历 demo/ 下所有子目录,对每个包含 package main 且含 func main() 的目录(如 demo/ 子目录),自动构建并安装对应可执行文件到 $GOPATH/bin/(或 go env GOPATH 指定路径下的 bin/ 目录)。同时,所有其他合法 Go 包(如 config/、crypto/)也会被下载并纳入模块缓存,供后续导入使用。

⚠️ 注意事项:

  • 确保 demo/ 目录下确实存在 package main 和 func main(),否则不会生成可执行文件;
  • 若使用 Go 1.16+ 且启用了 GO111MODULE=on(默认),推荐配合 go install 替代 go get 安装二进制(go install github.com/myproject/demo/demo@latest),因 go get 自 Go 1.18 起已弃用安装功能,仅用于添加/更新依赖;
  • 使用 ... 时需注意权限与网络开销——它会扫描所有子目录,包括 .git、testdata 或隐藏目录(若含合法 Go 文件);建议保持项目结构清晰,避免无关 Go 文件干扰。

? 总结:/... 是实现“一键安装全部可执行体 + 库”的标准实践,但现代 Go 工程更推荐显式指定路径(如 go install ./demo)或使用 go install + 版本标签,以提升可重现性与安全性。