2012-06-03 31 views
9

我GOPATH是/Users/joe/go。我正在致力於一個名爲myproj的項目,該項目名爲myproj使用Git(或任何VCS)的Go項目的正確組織是什麼?

如果我想能寫import "myproj"隨後的目錄結構我需要的是:

$GOPATH/src/myproj/myproj.go 
$GOPATH/src/myproj/myproj_test.go 
... 

不過,我似乎無法讓這個適合使用Git。如果我看一個example package from Google我看到下面的格式:

go.example/hello/hello.go 
go.example/LICENSE 

哪裏go.example是回購協議的名稱。

所以實際的包目錄中找到庫。如果我把這個存儲庫的內容放到我的$ GOPATH目錄中,例如

$GOPATH/src/go.example/hello/hello.go 
$GOPATH/src/go.example/LICENSE 

那麼我將不得不鍵入import "go.example/hello"而非import "hello"

說回我的項目,我需要在一個Git倉庫打包這件事之後我需要一個容器目錄。所以,我現在的文件結構是:

$GOPATH/src/myproj      # The dir for the git repo 
$GOPATH/src/myproj/.git 
$GOPATH/src/myproj/LICENSE    # Files in the base of the repo 
$GOPATH/src/myproj/myproj/myproj.go  # Package files in package dir 
$GOPATH/src/myproj/myproj/myproj_test.go 

我需要外myproj目錄綁定的git倉庫,我需要內部一個是包目錄。結果是我需要鍵入import "myproj/myproj"而不是import "myproj"

我該如何解決這個問題?我是否需要添加多個$ GOPATHS,每個項目都有一個用於我正在開發的項目?

在此先感謝。

+0

是的,你需要添加多個條目到你的GOPATH(按照你的平臺定義分開)。請閱讀我的詳細答案[this](http://stackoverflow.com/questions/10838469/how-to-compile-go-program-consisting-of-multiple-files) –

+2

IIUC:不,我不認爲建議每個包裝都有GOPATH條目。 – zzzz

+1

不是針對每個軟件包,而是針對每個項目(至少那些沒有在github(或類似的)中暴露並具有定義和固定URL的人)。 –

回答

8

第一關:

我一定要添加多個$GOPATH S,一個爲每個項目我發展?

不,您根本不需要多個$GOPATH s。

他們是一個管理您的(可能有幾個)項目的工具。當你建立一個新的項目環境時,你已經知道會有一些依賴關係 - 這個項目可能是獨一無二的,或者應該與其他人的設置類似,你創建一個新的項目文件夾並將其設置爲GOPATH。這樣,您也可以使用(=簽出)該項目的特定版本的庫,而將其他項目的其他版本用於其他項目文件夾中的其他項目(= GOPATH s)。

至於你的路徑問題:Go遵循author/project(或organization/project)的通用範例。這將防止幾個人,作者和組織開始使用相同名稱的項目命名衝突。 (作者然後可以使用子文件夾,子項目在「他」的文件夾,以及OFC)

如果你意識到這一點,並仍然只想myproj使用作爲你的包路徑,有在該文件夾中創建git存儲庫沒有問題 - 與鏈接的示例包相反。

回到我的項目,我需要將它打包到Git存儲庫中,然後我需要一個容器目錄。

是什麼讓你這麼想? Go不需要它。 Git既不。

所以下面的工作:

/src/myproj/.git 
/src/myproj/myproj.go 

雖然它不是鼓勵的做法,您可以把倉庫到你的myproj文件夾


我測試了這個如下:

FOLDER 
FOLDER/src 
FOLDER/src/myproj 
FOLDER/src/myproj/myproj.go 
FOLDER/src/mainproj 
FOLDER/src/mainproj/main.go 

隨着folder/src/myproj/myproj.go

package myproj 

type My struct { 
    I int 
} 

folder/src/mainproj/main.go

package main 

import (
    "fmt" 
    "myproj" 
) 

func main() { 
    my := myproj.My{7} 
    fmt.Printf("Works! %v", my.I) 
} 

運行

cd FOLDER 
set GOPATH=FOLDER 
go run src/mainproj/main.go 

將輸出:

Works! 7 

現在,如果你git init文件夾FOLDER/src/myproj,這也不要緊不惜一切去自己英寸

1

通常的設置是這樣的:

$ GOPATH,在第一近似只需要一個路徑,你的榜樣/Users/joe/go/就好了。現在你有一個github倉庫myprojhttp://github.com/joe/myproj看到。此軟件包的import語句應該是

import "github.com/joe/myproj" 

回首你的(單值)$ GOPATH,旅途工具將尋找你的包在$GOPATH/src/github.com/joe/myproj,這就是你的「外部」的github倉庫的「本地」根與文件myproj.go,etc.go,...裏面。

如果沒有這些約定,將會有與Jack(和Alice和Bob's)項目意外地被稱爲myproj的命名空間衝突,所以我建議從頭開始習慣這種權利。

0

你會自然地導入多個包:

  • 通用的標準
  • 少數的人,你會在其他下載使用go get
  • 少數的人在你的項目
  • 少數的人項目

最簡單的是選擇一個目錄,你會go get所有外部軟件包(例如mysql驅動程序)並將您的項目目錄添加到GOPATH。

例如,這裏是我(簡化)GOPATH:

export GOPATH=/home/dys/dev/go:/home/dys/dev/Chrall/go:/home/dys/dev/braldop/go:/home/dys/dev/lg/go 

我把得到的所有外部庫中/home/dys/dev/go和Chrall使用go get,braldop和LG是我的項目3個。

在這3個項目的每一箇中,我都有包和命令。例如:

/home/dys/dev/lg/go/src/pkg1/xxx.go 
/home/dys/dev/lg/go/src/pkg2/xxx.go 
/home/dys/dev/lg/go/src/prog1/xxx.go 

所有的包都通過GOPATH發現。

例如,當我使用一個驅動程序的MySQL,這些xxx.go之一:

import (
"database/sql" 
_ "github.com/ziutek/mymysql/godrv" 
) 

的驅動程序已經安裝在/ home/DYS的/ dev /去使用

go get github.com/ziutek/mymysql/godrv 

參考:http://golang.org/doc/code.html

GOPATH = /家庭/用戶/ EXT:/家庭/用戶/ mygo

(在Windows系統上使用 分號作爲路徑分隔符,而不是冒號。)

列表中的每個路徑(在這種情況下/首頁/用戶/分機或/家庭/用戶/ mygo) 指定工作區的位置。工作空間包含Go來源 文件及其關聯的包對象和命令可執行文件。

+0

我有很多已發佈的軟件包,我使用了很多其他的軟件包,我在未發佈的軟件包和未發佈的軟件包上工作,我有我的愛好項目並丟棄代碼,每個人都和平共處,而我的$ GOPATH是,而且一直是'$ HOME'。 – zzzz

+1

我也發佈了軟件包和其他人的軟件包。但不同之處可能在於,在我的大部分項目中,Go部分只是一小部分,我確實希望Go目錄與我的其餘項目一起使用。不知道它是否會以你的方式工作得很好(但如果你的意見在這一點上有所不同,這很有趣)。 –

相關問題