你如何编写一个包含多个二进制文件的包?

时间:2016-06-07 13:13:05

标签: go

我已经在不同的地方看过这个问题,答案如“使用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文件夹的默认建议?如果你这样做,你如何构建这些二进制文件?

4 个答案:

答案 0 :(得分:10)

如果您不想将二进制文件安装到$GOPATH/bin中,您可以执行其他开源项目所做的操作,即创建脚本。

大多数项目都有制作文件和构建脚本以生成多个二进制文件。

在您的情况下,您可以构建一个脚本来迭代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

您可以查看一些趋势项目:

答案 1 :(得分:9)

来自go build帮助:

  

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

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

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

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

答案 2 :(得分:6)

命令:

go install ./...

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

答案 3 :(得分:3)

你可以使用 git build 的 -o 标志。来自官方文档

<块引用>

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

所以你可以尝试类似的东西 go build -o . ./... 这实际上是为了在当前文件夹(-o 的 . 值)中为当前模块/文件夹/项目中的所有包编写结果可执行文件