【问题标题】:How to build multiple package binaries at once如何一次构建多个包二进制文件
【发布时间】:2021-10-13 02:52:45
【问题描述】:

我在很多地方都看到过这个问题,答案是“使用 cmd/foo,cmd/bar”类型的文件夹结构。

这对我不起作用。

这行得通:

$ du -a
8   ./src/cmd/bin1/main.go
8   ./src/cmd/bin1
8   ./src/cmd/bin2/main.go
8   ./src/cmd/bin2
16  ./src/cmd
8   ./src/shared/foo/foo.go
8   ./src/shared/foo
8   ./src/shared
24  ./src

并构建它:

go build ./src/cmd/bin2
go build ./src/cmd/bin1

但是,我不知道有什么变化:

go build ./src/...

我可能需要一步构建所有此类二进制文件。

这个布局:

$ du -a
8   ./cmd/bin1/main.go
8   ./cmd/bin1
8   ./cmd/bin2/main.go
8   ./cmd/bin2
16  ./cmd
8   ./src/shared/foo/foo.go
8   ./src/shared/foo
8   ./src/shared
8   ./src
24  .

似乎完全无法使用。 go build ... 命令的组合似乎无法构建 bin1 或 bin2。

我能得到的最好的结果是go build cmd/bin1/main.go,它给了我一个名为“main”的二进制文件。没有帮助。

那么,具体而详细地,包括go build 命令,它实际上构建了单个二进制文件,你是如何做到这一点的?

...为什么人们一直给出使用顶级cmd 文件夹的默认建议?如果这样做,您如何构建这些二进制文件?

【问题讨论】:

  • 签出https://github.com/spf13/cobra,您会将其指向cmd/main.go,其他命令源文件将用作例如main doXmain printY
  • 您可以使用 cobra 添加子命令,但它不会按预期生成多个二进制文件。

标签: go


【解决方案1】:

如果您不想将二进制文件安装到$GOPATH/bin,您可以像其他开源项目一样,创建一个脚本。

大多数项目都有用于生成多个二进制文件的 make 文件和构建脚本。

在您的情况下,您可以构建一个迭代 cmd 中的包的脚本,并在每个包上运行 go build

cd $GOPATH/someProject
for CMD in `ls cmd`; do
  go build ./cmd/$CMD
done

这会导致:

[root@node1 test]# ls $GOPATH/someProject
bin1  bin2  cmd

您可以查看的几个热门项目:

【讨论】:

    【解决方案2】:

    您可以使用go build-o 标志。来自官方文档:

    -o 标志强制构建将生成的可执行文件或对象写入 命名输出文件或目录,而不是中描述的默认行为 最后两段。如果命名输出是一个存在的目录,那么 任何生成的可执行文件都将写入该目录。

    所以你可以试试这样的:

    go build  -o . ./...
    

    这实质上是让 Go 在当前文件夹中写入生成的可执行文件 (-o. 值)适用于当前模块/文件夹/项目中的所有包。

    【讨论】:

      【解决方案3】:

      命令:

      go install ./...
      

      应该在当前目录下构建所有二进制文件(即./...)并将它们放在$GOPATH/bin上。

      【讨论】:

        【解决方案4】:

        来自go build 帮助:

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

        为了在一个目录下构建所有包,你可以运行go install ./...。您的所有软件包都将被构建和安装(即放在 $GOPATH/bin 下)。

        在您的示例中,您将生成两个可执行文件:$GOPATH/bin/bin1$GOPATH/bin/bin2

        也可以编写一个简单的 Makefile 来做你想做的事。

        【讨论】:

          猜你喜欢
          • 2016-08-04
          • 1970-01-01
          • 2017-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多