【发布时间】:2016-04-11 10:54:20
【问题描述】:
当从任何目录执行go build github.com/.../foo 时,编译后的二进制文件将放置在我执行命令的目录中。在执行go build /github.com/.../cmd/... 时,我希望所有已编译的二进制文件都出现在我的当前目录中。但他们没有。
如何将该包的多个/所有二进制文件编译到我当前的工作目录中?
【问题讨论】:
当从任何目录执行go build github.com/.../foo 时,编译后的二进制文件将放置在我执行命令的目录中。在执行go build /github.com/.../cmd/... 时,我希望所有已编译的二进制文件都出现在我的当前目录中。但他们没有。
如何将该包的多个/所有二进制文件编译到我当前的工作目录中?
【问题讨论】:
正如issue 23616 所说:
go build没有构建的事实是违反直觉的
当问题14295 "cmd/go: go build should be able to write multiple executables" 完成时,您将能够在当前目录中获取多个二进制文件。
但这将适用于 Go 1.13(不是 1.12,所以 2019 年末)
这离工作太近了。我不确定为什么没有。
我们应该为 Go 1.12 修复它。
显然-o不能与多个二进制目标一起使用,但隐含的“写入当前目录”应该可以工作,但它什么也不做。对提议的 CL 进行了一些讨论,以及评论认为所实施的 CL 破坏了
go build -a std cmd。
请参阅CL 143139/ (CL = "Change List")。
【讨论】:
您可以使用项目的文件路径(而不是包名)编译您的二进制文件,以在您的当前目录中生成它们。
例如:
$ go build ~/Go/src/github.com/.../cmd
并且二进制文件将在您的当前目录中。
【讨论】:
github.com/.../cmd/... 下的所有内容,而不是针对每个二进制文件
... 时,我的当前目录中不会放置任何文件。只有当我指定一个精确的二进制文件来构建它时,它才会被放入我当前的目录中。
cd 进入Dockerfile 所在的目录。我需要 .../cmd/cliA 和 .../cmd/cliB 来构建我当前的目录。我可以一个接一个地构建cliA 和cliB,但我想在一个命令中拥有它。但是go build .../cmd/... 不会将两个二进制文件都构建到我当前的目录中。仅当我明确指定 cliA 或 cliB 时才会发生这种情况
来自go build -h:
编译多个包或单个非主包时, build 编译包但丢弃生成的对象, 仅用于检查是否可以构建包。
但是你可以使用这个单行来实现相同的结果(只会构建直接在 cmd 下的二进制文件):
find $GOPATH/src/github.com/.../cmd -mindepth 1 -maxdepth 1 | xargs -n1 go build
【讨论】: