如何讓你的項目同時支持go vendor和go module
1. go module簡介
go module是go在1.11版本引入的新的版本依賴工具,是對vendor方式的一次升級. 目前是如果項目位於GOPATH下則會默認禁用go modoule,否則就會默認啟用.
因此首先需要將項目移出GOPATH,假設位於~/dev/smmodule目錄下.
2. 使用go mod命令管理項目
這里以我們的Photon項目為例,來說明如何實施.
2.1 初始化環境
cd ~/dev/smmodule/Photon
切換到項目以后首先要初始化.為了避免帶來莫名其妙的問題,建議先將vendor目錄移到其他地方,待配置完畢以后再移回來.
cd ~/dev/smmodule/Photon
go mod init
這時就會在Photon下產生了go.mod 文件,如果打開就會看到只有一句話
module github.com/nkbai/Photon
這個路徑是因為我這個項目在github上的路徑是 github.com/nkbai/Photon ,但是實際上,我這個項目只是module github.com/SmartMeshFoundation/Photon ,所以需要直接將其內容修改為
module github.com/SmartMeshFoundation/Photon
2.2 構建
這時候我們進入cmd/photon目錄,執行go build
命令,進行編譯.這時候就會看到go會根據項目代碼自動下載所有依賴的項目代碼. 這個過程可能會碰到各種問題.下面就常見的問題列出來.
2.2.1 需要翻牆的源碼怎么辦?
直接打開go.mod 添加replace項,
比如:
replace (
golang.org/x/net v0.0.0-20181106171534-e4dc69e5b2fd => github.com/golang/net latest
)
這表示系統依賴的 golang.org/x/net v0.0.0 這個版本應該從github.com/golang/net 這個地方下載latest
也就是最新版本.
2.2.2 我依賴的不能是最新的代碼怎么辦
我們的項目以前用的是vendor方式,可能依賴的是某個項目較早的版本,但是go下載的確實最新的版本,這時候只需到項目主頁找到你依賴的版本號即可.
比如Photon依賴的storm,go自動下載的是最新的2.1.2,但是無法編譯.
這時候就需要打開go.mod 直接修改
比如我這里直接將
github.com/asdine/storm v2.1.2+incompatible 修改為v2.1.1
這樣就可以正常編譯了.
2.2.3 我依賴的某個項目是我修改過的,和官方版本不一樣怎么辦
比如Photon依賴的go-ethereum實際上不是官方的任何一個版本,是根據我們自己的需要,做了修改的版本. 那么這時候也很簡單,直接clone一個官方的版本到自己的github上,然后修改. 待修改完畢以后,新建一個版本即可.
比如我就把 github.com/ethereum/go-ethereum clone到我自己的github上,然后按照vendor中的修改重新來一遍,然后打了一個v1.9.1的tag.
然后同樣replace成下面的.
replace (
github.com/ethereum/go-ethereum v1.8.17 => github.com/nkbai/go-ethereum v1.9.1
)
2.2.4 其他注意事項
由於go mod目前處於較早起版本,我們手工修改文件要特別注意 否則會碰到莫名其妙的問題.我說一下我碰到的兩個問題
-
- replace和(之間的空格一定不能少
-
- => 前后的空格一定不能少
-
- 如果替換的版本號不知道是多少,直接寫latest,go會自己找到最新版本填上去.
3. 保持兼容性
將原來的vendor目錄移回來,這時候你會發現項目沒什么變化,只是多了兩個go.mod和go.sum兩個文件,直接添加將其提交到github即可.
這時候,你這個項目既可以在GOPATH下像以前一樣管理,也可以在獨立的其他目錄中編譯運行.
4. 使用goland來管理你的新版項目
記得新建項目,並且在新建的時候選擇go module即可.