Go 1.14解決Go Modules模式下更新私有庫問題


  在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的版本發布了,不然過幾個版本之后,現在的這些特性還不知道會做出怎樣的修改,或者推出了什么更高級的特性,期待~~~

 

參考

1. Go 1.14 Release Notes

2. Using Go Modules

3. add GOINSECURE for insecure dependencies

4. track tools/tooling updates to support modules


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM