我已经在不同的地方看过这个问题,答案如“使用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
文件夹的默认建议?如果你这样做,你如何构建这些二进制文件?
答案 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 的 . 值)中为当前模块/文件夹/项目中的所有包编写结果可执行文件