【问题标题】:Build multiple binaries into current directory在当前目录中构建多个二进制文件
【发布时间】:2016-04-11 10:54:20
【问题描述】:

当从任何目录执行go build github.com/.../foo 时,编译后的二进制文件将放置在我执行命令的目录中。在执行go build /github.com/.../cmd/... 时,我希望所有已编译的二进制文件都出现在我的当前目录中。但他们没有。

如何将该包的多个/所有二进制文件编译到我当前的工作目录中?

【问题讨论】:

    标签: go build


    【解决方案1】:

    正如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")。

    【讨论】:

    【解决方案2】:

    您可以使用项目的文件路径(而不是包名)编译您的二进制文件,以在您的当前目录中生成它们。

    例如:

    $ go build ~/Go/src/github.com/.../cmd
    

    并且二进制文件将在您的当前目录中。

    【讨论】:

    • 这个想法是一次构建路径 github.com/.../cmd/... 下的所有内容,而不是针对每个二进制文件
    • 所以将“...”附加到您的目录路径(就像您所做的那样)。在 Go 中,“x/...”表示“x/ 下的每条路径”。
    • 正如我在问题中所描述的:添加 ... 时,我的当前目录中不会放置任何文件。只有当我指定一个精确的二进制文件来构建它时,它才会被放入我当前的目录中。
    • 请张贴一个你正在尝试做的具体案例,而不是一个例子。发布命令和输出。使用“go build -v”来启用更详细的输出。我正在运行我在答案中发布的命令,它会在我的当前目录中生成一个二进制文件(这与代码所在的位置非常不同)。它也应该适合你。
    • 这正是我的用例。在 CI 系统上,我必须构建一个 Docker 映像。所以我cd 进入Dockerfile 所在的目录。我需要 .../cmd/cliA.../cmd/cliB 来构建我当前的目录。我可以一个接一个地构建cliAcliB,但我想在一个命令中拥有它。但是go build .../cmd/... 不会将两个二进制文件都构建到我当前的目录中。仅当我明确指定 cliAcliB 时才会发生这种情况
    【解决方案3】:

    来自go build -h

    编译多个包或单个非主包时, build 编译包但丢弃生成的对象, 仅用于检查是否可以构建包。

    但是你可以使用这个单行来实现相同的结果(只会构建直接在 cmd 下的二进制文件): find $GOPATH/src/github.com/.../cmd -mindepth 1 -maxdepth 1 | xargs -n1 go build

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2021-04-07
      相关资源
      最近更新 更多