如何使用私有倉庫的 Go Modules
本文我們將討論 go modules 的基本用法,以及如何創(chuàng)建自己的 go modules,如何在自己的 go 項目中引用私有 git 倉庫的模塊。模塊大大提高了 go 的代碼可維護性,它是 golang 官方提供的依賴管理工具,就像 Java 應用中的 Maven 一樣,如果你對 go modules 了解不多,可以查看官方文檔相關介紹。
創(chuàng)建 go module
在 Java 中,一個制品可以通過 Nexus 這樣的倉庫來維護的,同樣,我們可以將自己的 go modules 托管在 Git 或 Bitbucket 上,比如我們這里使用非常方便的 GitHub。創(chuàng)建一個如下所示的目錄,在目錄中初始化 modules:
$?mkdir?common-module
$?cd?common-module
在項目中初始化 go 模塊的名稱,這里的名稱格式為 。
hosting-site: 就是 github.com repository: 自己的 github 帳號名(ereshzealous) module:模塊名稱 common-module
所以最后 go 模塊的名稱就是 github.com/ereshzealous/common-module ,用 go mod init 初始化:
$?go?mod?init?github.com/ereshzealous/common-module
接下來我們在這個模塊中創(chuàng)建一個簡單的 go 文件,添加幾個示例函數(shù):
package?common
//?GetCommonData?a?method
func?GetCommonData()?string?{
?return?"Common?Data"
}
func?GetData()?string?{
?return?"Data"
}
然后將代碼提交到 GitHub 上,并將其發(fā)布為一個版本。

發(fā)布后我們就可以在其他 go 項目中使用上面的 go modules 了,由于這個項目是公開的,所以所有人都可以使用,接下來我們將這個公開版本轉(zhuǎn)變成私有倉庫。
開發(fā)環(huán)境
如果上面的 go modules 已經(jīng)變成私有倉庫了,這個時候我們使用go get 命令來獲取這個模塊,會得到一個 410 Gone 的錯誤信息:

要解決上述問題,在 go 項目中引入私有模塊可以用如下所示的方式。
1. 通過 Go Mod 代理網(wǎng)站
Go Module 的代理站點默認的 repo 是 https://proxy.golang.org/,direct ,由于我們的模塊發(fā)布在 github 上,所以我們需要提供一種機制來繞過代理站點的私有倉庫,這里可以使用 GOPRIVATE 來實現(xiàn),GOPRIVATE 環(huán)境變量用來表示不對外公開的模塊路徑。
在開發(fā)環(huán)境中我們可以按照如下命令設置GOPRIVATE,多個值用逗號隔開。下面設置的是我的賬戶級別,我們也可以設置成倉庫級別,比如 github.com/ereshzealous/common-module。
$?go?env?-w?GOPRIVATE=github.com/ereshzealous
2. 在構建過程中傳遞倉庫憑證
由于我們使用的是 Github,所以我們在構建過程中需要提供 auth token。在開發(fā)環(huán)境中,這很簡單,有一個 git 命令來實現(xiàn)這個功能,在 gitconfig 文件中添加一個配置即可。
點擊這里進入 GitHub 訪問令牌頁面,創(chuàng)建一個具有相應權限的 token,創(chuàng)建一個新的 token 或使用一個現(xiàn)有的 token 都可以。

在生成 token 后,執(zhí)行以下命令。
Github
$?git?config?--global?url."https://${username}:${access_token}@github.com".insteadOf?/
"https://github.com"
Bitbucket
在 Bitbucket 中,同樣創(chuàng)建一個訪問 token 并執(zhí)行以下命令。
$?git?config?--global?url."https://${bitbucket_user_id}:${bitbucket_access_token}@privatebitbucket.com".insteadOf?
??"https://privateaccount.com"
在 gitconfig 中進行上述設置后,我們再來嘗試使用 go modules。

我們可以看到是可行的,當然對于 GitLab 私有倉庫也是一樣的操作方式,這對于開發(fā)環(huán)境來說都很方便,那么對于 CI/CD 或者 Docker 容器化環(huán)境應該怎么辦呢?
Docker
其實對于 Docker 容器中,私有私有 go modules 也很方便,我們可以直接在 Dockerfile 中配置私有倉庫,如下所示:
#?Start?from?the?latest?golang?base?image
FROM?golang:alpine
RUN?GOCACHE=OFF
RUN?go?env?-w?GOPRIVATE=github.com/ereshzealous
#?Set?the?Current?Working?Directory?inside?the?container
WORKDIR?/app
#?Copy?everything?from?the?current?directory?to?the?Working?Directory?inside?the?container
COPY?.?.
RUN?apk?add?git
RUN?git?config?--global?url."https://golang:@github.com" .insteadOf?"https://github.com"
#?Build?the?Go?app
RUN?go?build?-o?main?.
#?Expose?port?8080?to?the?outside?world
EXPOSE?8080
在上面的 Dockerfile 中,第6行我們通過環(huán)境變量 GOPRIVATE 設置了私有倉庫地址;在第17行通過 gitconfig 設置了一個訪問 token 和用戶名,這會把憑證傳遞給 go mod,為了使用 git 命令,還特地在鏡像中添加了 git 命令。

上面構建過程中的 pvt 就是一個私有的 go mod 倉庫,可以看到正常獲取。當然在 CI/CD 的流水線當中也可以直接使用這個方式。
參考鏈接
https://medium.com/swlh/go-modules-with-private-git-repository-3940b6835727 https://blog.golang.org/using-go-modules
推薦閱讀

