2016-06-07 39 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做你想要什麼樣的選擇。

相關問題