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

Dou*_*oug 8 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
Run Code Online (Sandbox Code Playgroud)

并建立它:

go build ./src/cmd/bin2
go build ./src/cmd/bin1
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚有什么变化:

go build ./src/...
Run Code Online (Sandbox Code Playgroud)

我可能需要一步构建所有这些二进制文件.

这个布局:

$ 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  .
Run Code Online (Sandbox Code Playgroud)

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

我能得到的最好的是go build cmd/bin1/main.go给我一个名为'main'的二进制文件.没用.

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

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

Kes*_*ava 16

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

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

所以你可以尝试这样的事情:

go build  -o . ./...
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*and 11

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

大多数项目都有make文件和构建脚本来生成多个二进制文件.

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

cd $GOPATH/someProject
for CMD in `ls cmd`; do
  go build ./cmd/$CMD
done
Run Code Online (Sandbox Code Playgroud)

这导致:

[root@node1 test]# ls $GOPATH/someProject
bin1  bin2  cmd
Run Code Online (Sandbox Code Playgroud)

您可以查看几个趋势项目:


T. *_*rie 9

go build帮助:

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

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

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

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


cd1*_*cd1 6

命令:

go install ./...
Run Code Online (Sandbox Code Playgroud)

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