為什么要考慮私有倉庫
Go語言目前都已經采用了官方統一的 go modules
來管理依賴,后續也不太可能出現比較亂的生態, 因此了解下如何讓這個依賴管理正常工作是非常必要的。
對于Github或者其他公有倉庫,依賴管理是非常直接和方便的,設置好GOPROXY后,使用 go get
去直接操作依賴,是不會報錯的,很方便直接, 但是對于一些公司或者組織,一些代碼不能公開的, 那就涉及到私有依賴管理了, 通常而言,直接使用go get
肯定會報錯,去網上搜搜也不太全,設置完git url替換 之后,依然會報錯。 本文主要是講述,如何進行開發設置而不報錯。
對于沒有子目錄的gitlab項目
如下面這種方式:
# 倉庫地址
https://gitlab.com/group/project# gomodule 名稱為
gitlab.com/group/project
可以使用如下命令進行設置, 設置完成之后,則可以通過?go get
自動獲取到依賴
# 設置GOPRIVATE環境變量
go env -w GOPRIVATE=gitlab.com
go env -w GOPRIVATE=gitlab.bitmartpro.com# 設置URL替換,把https轉為ssh獲取依賴
git config --global url."git@gitlab.com".insteadOf "https://gitlab.com"
git config --global url."git@gitlab.bitmartpro.com:".insteadOf "https://gitlab.bitmartpro.com/"# 如果遇到https報錯,可以設置如下,如果本身就是正常的https就不用去管了
git config --global http.sslVerify false
按照如上方法設置一下,你就能輕松通過?go get
來獲取到私有的依賴,但這種方式有一個弊端,就是如果項目放在子目錄下面,則依賴獲取仍然會失敗,下面就會講一下兩種在子目錄存在的情況下,如何正常去獲取私有依賴的方法。
對于子目錄的gitlab項目
如下面這種方式
# 項目地址
https://gitlab.com/group/subgroup/project# go module 名稱
gitlab.com/group/subgroup/project
即使我們設置了正常的ssh key,和git的url替換,仍然會得到報錯
The project you were looking for could not be found or you don't have permissions to view it.
當我們用搜索引擎去搜去解決問題的時候,我們基本上搜到的結果都是讓你去改 go module 的名稱,如下
rm go.mod go.sum
go mod init gitlab.com/myuser/foogroup/barlib.git
go mod tidycd /go/src/another_project
go get gitlab.com/myuser/foogroup/barlib.git
它要求,必須要以 .git
結尾,這樣是一種比較簡單的解決方案,但是正常的go module 命名一般是不帶 .git
結尾的。 發生這種情況的原因是,它go get嘗試發現給定路徑上的模塊以找到請求的 Go 模塊存儲庫。只有找到存儲庫后,工具才會執行git clone或git checkout使用 SSH 密鑰進行身份驗證。問題歸結為這樣一個事實:如果沒有 Gitlab 訪問令牌,就無法列出/查看私有Gitlab 子組。 所以這個時候,我們就要用到下面這種方法。
- 在gitlab中創建token
Gitlab->Preferences->Access Tokens
- 對于windows系統, 你可以先設置一個HOME的環境變量,指向你的用戶目錄,然后在用戶目錄下創建
_netrc
文件; 對于Mac/Linux 則可以直接創建~/.netrc
文件 - 按照如下方式編輯
~/.netrc
文件
machine gitlab.comlogin my_gitlab_usernamepassword my_gitlab_token
- 上述machine是指你的gitlab倉庫的地址
- login 則為你的gitlab的用戶名
- password就是第一步創建的gitlab訪問token
結合如上幾種方式,你應該可以完整的解決掉你的go 獲取私有依賴的問題。