2013-01-11 71 views
15

我正在構建一個庫,但我也希望它可以作爲獨立的二進制文件使用。我可以使用同名的庫和二進制文件嗎?

例如,假設我正在構建Tar的實現。 Tar通常用作命令,但它也可以用作庫。直覺上,我會這樣做:

src/ 
    tar/ 
     tar.go # belongs to package tar 
     main.go # imports tar and provides a main function 

雖然這似乎並不奏效。從documentation,似乎「命令」應該有一個單獨的庫名稱。適應給予有這個例子的例子,我有以下目錄結構:

src/ 
    tar/ 
     tar.go # belongs to package tar 
    tarbin/ 
     main.go # imports tar and provides a main function 

然而,這將創建一個名爲tarbin$GOPATH/bintar命令。我找到的解決方法是做go build -o $GOPATH/bin/tar tar,但我感覺我正在做一些可怕的錯誤。有沒有更好的辦法?

注意:我很清楚tar是包含在標準庫中,我只用它作爲例子。

回答

21

我可能做到這一點

src/ 
    tar/ 
     tar.go   # tar libary 
     tar/ 
      main.go # tar binary 

這會給你一個名爲tar二進制文件和一個名爲庫tar

比方說,你在GitHub上託管這點,你會想

src/ 
    github.com/ 
     you/ 
      tar/ 
       tar.go   # tar libary 
       tar/ 
        main.go # tar binary 

當你做go get install github.com/you/tar/tar和一個名爲的庫時,它會給你一個名爲tar的二進制文件210,當你做go get install github.com/you/tar

根據您的感覺是,你可以交換庫和二進制過

src/ 
    github.com/ 
     you/ 
      tar/ 
       main.go   # tar binary 
       tar/ 
        tar.go   # tar libary 

保持所有的代碼在一個樹允許你做go install ./...,從根本上建立更重要所有的包和子包都是一個優勢。 go test|fmt ./...也。 (注意,確實是3個點!)

+0

太棒了!我喜歡這個比我的'go build -o ...'更好......'破解... – tjameson

+0

除了「go build」將會失敗,因爲你的二進制文件將被命名爲本地目錄(「tar」)。在這種情況下,您必須使用「go build -o」。 – Gravis

+0

@Gravis我明白你的意思了。然而'go install'是你想用來構建二進制文件的東西 - 幾乎從不使用'go build',因爲它不緩存構建。我將編輯響應以刪除對「go build」的引用。 –

相關問題