2012-04-12 52 views
52

我無法理解創建具有本地程序包的go項目的工作流程。轉到,去獲取,去安裝,本地包和版本控制

說我創建了一個新項目,使用git進行版本控制,它有一個main.go文件和一個tools.go文件,它將在程序包utils中。所以我有一個目錄結構像這樣:

/myproject/ 
    main.go 
    utils/ 
    tools.go 

main.go看起來是這樣的:

package main 
import "./utils" 
func main() { 
    utils.DoSomthing() 
} 

和tools.go看起來是這樣的:

package utils; 
func DoSomething() { 
} 

一切工作就好了在本地,使用去建造去運行。但是這是在github上託管的,我希望能夠讓其他人使用去獲得命令來安裝它。因此,本地軟件包導入必須更改爲使用格式「github.com/user/project/utils」,它的工作原理除了現在我有兩個源代碼副本,真正的問題是具有git歷史記錄的副本有一個導入使用下載的副本。因此,如果我正在使用git歷史記錄複製副本,則對tools.go所做的任何更改都將被忽略,因爲它將使用下載的副本。

所以我想知道是否有人可以解釋使用的正確方法去獲得,版本控制和包導入同一個項目。

回答

81

我剛剛寫了一個關於如何使用新的go toolgithub.com的簡短步驟指南。可能會發現它很有用:

1.設置您的GOPATH

您可以將環境變量GOPATH設置爲您喜歡的任何目錄。如果你有更大的項目,爲每個項目創建一個不同的GOPATH可能是一個好主意。我會特別推薦這種方法用於部署,因此爲項目A更新庫不會中斷項目B,這可能需要早期版本的同一個庫。

另請注意,您可以將GOPATH設置爲由冒號分隔的目錄列表。所以你可能有一個包含所有常用軟件包的GOPATH,並且爲每個項目使用附加軟件包或不同版本的現有軟件包分開GOPATHS。

但是,除非您正在同時處理許多不同的Go項目,否則它可能足以在本地生成一個GOPATH。所以,讓我們創建一個:

mkdir $HOME/gopath 

然後,你需要設置兩個環境變量來告訴go tool在那裏可以找到現有的圍棋包和它應該安裝新的。最好將以下兩行添加到您的~/.bashrc~/.profile(並且不要忘記在之後重新加載.bashrc)。

export GOPATH="$HOME/gopath" 
export PATH="$GOPATH/bin:$PATH" 

2.創建一個新的項目

如果你想創建應在github.com以後主持一個新的圍棋項目,你應該$GOPATH/src/github.com/myname/myproject下創建此項目。路徑與github.com repo的URL匹配很重要,因爲go工具將遵循相同的約定。所以,讓我們創建項目的根和初始化一個新的Git倉庫有:

mkdir -p $GOPATH/src/github.com/myname/myproject 
cd $GOPATH/src/github.com/myname/myproject 
git init 

因爲我不喜歡打字這麼長的路,我通常創建我目前的工作在我的主文件夾的項目符號鏈接:

ln -s $GOPATH/src/github.com/myname/myproject ~/myproject 

3.編寫應用程序

開始編碼,不要忘記git addgit commit您的文件。另外,不要使用像import "./utils"這樣的相對導入子包。他們目前沒有文件,根本不應該使用,因爲他們不會使用go工具。改用github.com/myname/myproject/utils之類的導入。

4.發佈項目

創建new repository at github.com,上傳您的SSH公共密鑰,如果你還沒有沒有做過,推動更改到遠程倉庫:

git remote add origin [email protected]:myname/myproject.git 
git push origin master 

5 。繼續處理你的項目

如果你在你的.bashrc中設置了GOPATH,並且你已經爲你的項目創建了一個符號鏈接在您的家庭文件夾中,您只需鍵入cd myproject/並在那裏編輯一些文件。之後,您可以使用git commit -a提交更改,並通過執行git push將它們發送到github.com

+3

我最近一直在接受這個問題。我開始做的只是一個GOPATH,並將我的項目融入其中。這樣我可以輕鬆構建,但將實際項目保留在自己的回購站中。這感覺像是一個非常乾淨的方法。 – jdi 2012-05-05 05:53:12

+0

Github路徑往往很長,我很懶,所以我給我的bashrc添加了一個別名:'alias g =「cd /home/me/goroot/src/github.com/me/」'。現在我可以通過簡單的g命令快速訪問我的項目。 – 2014-01-06 15:57:03

+0

你如何跟蹤你的軟件包使用的外部依賴關係? – mohi666 2014-11-19 01:47:35

10

你可能不想要兩個源的副本。在How to Write Go Code之後,你應該有一個你開發Go的路徑,可以說「godev」,在那之下有一個「src」目錄,在你的「github.com/user/project」和「github.com」目錄下/用戶/項目/ utils的」。 (我同意,這似乎有點僵化,但向我們解釋的優勢是免於製作文件。)放棄項目,這是您將在其中完成工作的地方。

您將至少將GOPATH設置爲godev,但您可能希望您的GOPATH以不屬於您的外部包的路徑開始。例如,我使用的GOPATH是<my place on the file system>/goext:<my place on the file system>/godev

你是對的,你在main.go進口,現在應改爲「github.com/user/project/utils。

不要擔心去獲得或任何旅途中的命令覆蓋您的文件或搞亂通過GOPATH,他們看到你在哪裏工作,他們知道如何進行版本控制

+0

我有一個相關的問題,並在此之後你的指引,但我現在得到一個「進口環」的錯誤。我的源代碼是 \ godev \ src \ github.com \ user \ project,項目導入「github.com/user/project」。 – Alec 2012-04-18 05:00:43

+1

你的項目不應該嘗試導入自己。只要繼續上面的示例代碼,您的主程序應該導入「github.com/user/project/utils」。 – Sonia 2012-04-18 18:55:49

4

如果您想將代碼保存在本地版本庫中,只需將代碼放入GOPATH即可。

GOPATH接受多個路徑。 例如。在Linux上

GOPATH=$HOME/go:$HOME/prj/foo 

所以,你可以去找安裝在$ HOME /去/ src目錄/ ... 第三方軟件包和,你可以保持在$ HOME/PRJ /富/ src目錄控制你的代碼。

裁判:go help gopath

+0

這個!或者索尼婭的回答。 – user7610 2017-11-21 14:00:40