2016-06-07 86 views
2

我已经在各个地方看到过这个讨论,例如'使用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

查看'https:// github.com/spf13/cobra',你会将它指向'cmd/main.go',其他命令源文件将被用作例如。 '主要的doX''主要的printY' – Plato

+0

你可以添加带有眼镜蛇的子命令,但它不会像预期的那样产生多个二进制文件。 –

回答

3

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

在那里的大多数项目已经生成文件和生成多个二进制文件的脚本。

对于您的情况,您可以构建一个脚本,遍历cmd中的包,并在每个包上运行go build

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

这导致:

[[email protected] test]# ls $GOPATH/someProject 
bin1 bin2 cmd 

夫妇趋势,你可以看一下项目:

6

命令:

go install ./... 

应该建立自己的当前目录(即./...)下的所有的二进制文件,并把它们放在$GOPATH/bin

7

go build帮助:

当编译多个包或单一非主包, 构建编译软件包,但丢弃所产生的对象, 仅作为检查套餐可建。

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

你的榜样,你有两个可执行文件生成:$GOPATH/bin/bin1$GOPATH/bin/bin2

还有写一个简单的Makefile做你想要什么样的选择。

相关问题