[英]Whats a good best practice with Go workspaces?
我剛剛開始學習 Go,並閱讀現有代碼以了解“其他人是如何做的”。 在這樣做時,go“工作區”的使用,尤其是當它與項目的依賴項相關時,似乎無處不在。
在處理各種 Go 項目時,圍繞使用單個或多個 Go 工作區(即 $GOPATH 的定義)有什么(或有)常見的最佳實踐? 我應該期望有一個單一的 Go 工作區,它有點像我所有項目的中央代碼存儲庫,還是在我開始處理這些項目中的每一個時明確地分解它並設置 $GOPATH(有點像 python虛擬環境)?
我認為每個項目有一個$GOPATH
更容易,這樣你就可以為不同的項目使用相同包的不同版本,並根據需要更新包。
使用中央存儲庫,很難更新包,因為這樣做可能會破壞不相關的項目(如果包更新有重大更改或新錯誤)。
我曾經使用過多個 GOPATH——實際上是幾十個。 在項目之間切換和維護依賴項要困難得多,因為在一個工作區中進行有用的更新需要我在其他工作區中進行更新,有時我會忘記並撓頭,想知道為什么該依賴項在一個項目中有效但不是另一個。 慘敗。
我現在只有一個GOPATH 並且我實際上把我所有的開發項目——不管去不去——都放在里面。 有了一個中央工作區,我仍然可以將每個項目保存在自己的 git 存儲庫 ( src/<whatever>
) 中,並在必要時使用 git 分支來管理依賴項(實際上很少使用)。
我的建議:只使用一個或兩個工作區(例如,如果您需要將工作和個人代碼更加分開,盡管推薦的包路徑命名約定應該為您做到這一點)。
如果您只是將GOPATH
設置為$HOME/go
或類似的並開始工作,那么一切都是開箱即用的,非常簡單。
如果您為許多項目制作了許多帶有許多 bin 目錄的GOPATH
s,這些項目在各種新鮮狀態下都有許多共同的依賴項,這應該很明顯,這會讓自己變得更難。 那只是更多的工作。
如果你發現,有時你需要隔離一些東西,那么你可以創建一個單獨的GOPATH
來處理這種情況。
但總的來說,如果你發現自己做了更多的工作,那通常是因為你選擇讓事情變得更難。
在過去的四年里,我已經積累了近 100 個項目。 我幾乎總是在GOPATH
工作,它是我電腦上的$HOME/go
。
在您的所有項目中使用一個 GOPATH 非常方便,但我發現這僅適用於我自己的個人項目。
我為我維護的每個生產系統使用單獨的 GOPATH,因為我在每個 GOPATH 的目錄樹中使用 git 子模塊來凍結依賴項。
所以,像這樣:
~/code/my-project
- src
- github.com
+ dependency-one
+ dependency-two
- my-org
- my-project
* main.go
+ package-one
+ package-two
- pkg
- bin
通過將 GOPATH 設置為 ~/code/my-project,然后它在該項目中使用依賴項一和依賴項二的 git 子模塊,而不是使用全局依賴項。
嘗試envirius(通用虛擬環境管理器) 。 它允許編譯任何版本的go
並基於它創建任意數量的環境。 $GOPATH
/ $GOROOT
取決於每個特定的環境。
此外,它允許使用混合語言創建環境(例如, python
和go
在一種環境中)。
在我的公司,我創建了Virtualgo以使管理多個GOPATH
變得非常容易。 與手動處理相比,它有幾個優點:
cd
到項目時自動切換到正確的GOPATH
。GOPATH
作為備份。 如果在項目特定的工作區中找不到包,它將搜索主GOPATH
。對我來說,一個工作區 + Godep是最好的。
我遵循 KISS - 一個 GOPATH,兩條路徑:
出口 GOPATH=$HOME/go:$HOME/development/go
這樣第三方的東西放在一個中心位置(包安裝默認使用第一個路徑條目),我可以靈活地將我的項目移動到其他地方,在第二個路徑條目。
您可能想嘗試使用direnv
包。
只需使用 GoSwitch。 節省了大量的時間和理智。 將腳本添加到每個項目的根目錄並獲取它。 它將使該項目目錄成為您的 gopath,並將該項目的確切 bin 文件夾添加/刪除到路徑。 https://github.com/buffonomics/goswitch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.