文章目錄
- Golang版本控制
- go mod使用私有倉庫(gitlab)依賴設置
- 配置代碼托管站點
- Go mod尋找代碼倉庫原理
- 使用代理實現代碼托管站點訪問
Golang版本控制
go version v1.22.0
當我們新建一個go
項目時,在項目根目錄下執行go mod init
可以初始化go.mod文件用于管理包依賴。后續執行go mod tidy
更新并下載所有的依賴包。
如果我們沒有進行配置,則只能訪問公共開源倉庫。如果想要下載私有倉庫依賴包則需要進行一些配置。
go mod使用私有倉庫(gitlab)依賴設置
假如想配置托管站點gitlab.example.cn
,按照如下步驟操作:
- 設置GOPRIVATE環境變量,防止走代理:
go env -w GOPRIVATE=*.gitlab.example.cn/*
go env -w GONOPROXY=*.gitlab.example.cn/*
- 配置倉庫訪問權限,有兩種方式:
- 方式一(推薦): 配置git將請求從ssh轉換為https:
git config --global url."ssh://git@gitlab.example.cn/".insteadof "https://gitlab.example.cn/"
- 方式二:添加倉庫訪問Token:
git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN"
- 方式一(推薦): 配置git將請求從ssh轉換為https:
- 由于訪問不到驗證服務器,如下方式二選一:
- 方式一:
go env -w GONOSUMDB=gitlab.example.com/*
- 方式二:關閉驗證服務
go env -w GOSUMDB=off
- 方式一:
- 如果私有庫不支持https協議,設置跳過CA證書校驗:
go env -w GOINSECURE='gitlab.example.com/*'
配置完成后可以git config -l
查看git配置,也可以通過.gitconfig直接編輯git配置:
[http]extraheader = PRIVATE-TOKEN:UsQsxy5q_Nqy-pXHtu-V[url "ssh://git@gitlab.example.cn/"]insteadof = https://gitlab.example.cn/
通過go env
查看環境變量配置,也可以直接通過profile配置環境變量:
export GOPRIVATE=*.gitlab.example.com/*
export GONOPROXY=*.gitlab.example.com/*
export GOINSECURE=*.gitlab.example.com/*
export GONOSUMDB=*.gitlab.example.com/*
配置代碼托管站點
Go mod尋找代碼倉庫原理
https://pkg.go.dev/cmd/go#hdr-Remote_import_paths
如果import路徑不是已知的代碼托管站點并且也缺少版本控制限定符,則go工具會嘗試通過https/http獲取導入并在文檔的HTML <head>
中查找<meta>
標記。
元標記的形式如下:
<meta name="go-import" content="import-prefix vcs repo-root">
使用mod時,會識別go-import
元標記的附加變體,并且優先級高于那些默認的版本控制系統。該變體使用mod
作為內容值中的vcs
,如下所示:
<meta name="go-import" content="example.org mod https://code.org/moduleproxy">
此標簽表示從 URLhttps://code.org/moduleproxy
上的模塊代理中獲取路徑以 example.org
開頭的模塊。有關代理協議的詳細信息, 請參閱https://golang.org/ref/mod#goproxy-protocol 。
查找模塊路徑的存儲庫:https://go.dev/ref/mod#vcs-find
使用代理實現代碼托管站點訪問
一般主流的代碼托管站站點如github,gitlab,Gitee等,都默認支持返回站點的golang mod元數據。
如果無法對外暴露站點的域名,且甚至無法擁有更改站點訪問地址的權限。比如,部署站點的時候是以ip+port
的方式訪問。這時需要配置一個虛擬的域名作為go mod的引用包路徑,這時可以使用Nginx配置站點的內網訪問代理,返回帶有元標記的靜態頁面。例如要訪問站點gitlab.example.com
:
if ($args ~* "^go-get=1") {set $condition goget;}if ($uri ~ "(/[^/]+/[^/]+)(/.*)?") {set $condition "${condition}path";}if ($condition = gogetpath) {return 200 "<!DOCTYPE html><html><head><meta content='gitlab.example.com$1 git https://gitlab.example.com$1.git' name='go-import'></head></html>";}
參考:https://stackoverflow.com/questions/26347516/using-go-get-on-a-personal-git-repo