在Go 1.11之后推出了依賴包管理工具Go Modules之后,Go項目可以在 GOPATH 之外的位置創建,當項目中僅使用了公有庫作為依賴時,使用 go get 或 go mod 更新依賴一切如初,沒有任何問題。
由於Go Modules默認使用代理去更新依賴,所以當使用了私有倉庫作為依賴時,Go更新依賴的相關命令將不再可用。
通過以下配置,可以實現更新支持https協議的私有庫依賴。
1. 設置 GOPRIVATE 環境變量 go env -w GOPRIVATE=private.repo.com
2. 修改git的全局配置
git config --global url."ssh://git@private.repo.com".insteadOf "https://private.repo.com"
然而如果私有庫不支持https協議,會報如下的錯誤。這是因為Go更新依賴時,會強制校驗CA證書來確保依賴庫的安全性。
go: private.repo.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "private.repo.com/modules/project": https fetch: Get "https://private.repo.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused
如果要更新不支持https協議的私有庫,還需再做如下的配置。
1. 需要對git的全局配置做出調整,將https改為http。
git config --global url."ssh://git@private.repo.com".insteadOf "http://private.repo.com"
2. 添加參數或環境變量。
1) 使用 go get -insecure
這種方式不推薦,原因如下
1. 添加 -insecure 參數即表示更新依賴時可以不去校驗CA證書,但是這會帶來一個問題:范圍無法界定(overkill),所有與要更新依賴相關聯的依賴,均不會去做校驗,可能會意外更新到不安全的依賴。
2. -insecure 僅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令時是無法更新不支持https協議的私有庫的。
2) 添加 GOINSECURE 參數
推薦這種方式
在Go 1.14中增加了新的環境變量,用於指定哪些域名下的倉庫不去校驗CA證書。
使用方式同 GOPRIVATE 類似 go env -w GOINSECURE=private.repo.com
感受
這兩天在家折騰Go語言,搞得我很懷疑人生,網上的好多博客都是使用舊版本Go的,在新版本出了一些新特性之后,很多方式都改了。第一次感受到我在緊跟一個開源項目的腳步,還是這么火的一個語言。
Go現在給我的感覺就是,它還在一個緊鑼密鼓的開發階段,一些特性,一些功能,還沒有那么完善。就拿Go Modules來說,它是Go 1.11才推出的一個功能,截止到1.14,還未支持所有的Go Tools,GOINSECURE也是1.14才提供的一個參數,未來如何發展還是未知數。
Go的開源社區還是相當活躍的,好多疑問都可以在里面找到解答,甚至是官方的解答(找不到中文的博客,只能Google去看Github和Stack Overflow,英文不好的我默默的留下了眼淚)。看來之后我要緊跟Go的版本發布了,不然過幾個版本之后,現在的這些特性還不知道會做出怎樣的修改,或者推出了什么更高級的特性,期待~~~
參考