在企業內部創建一個公共的Golang模塊工程可以幫助提高代碼復用性和開發效率。本文將從如何創建一個公共的Golang工程開始,指導你一步步創建它、并引入到你的工程中。
1、公共模塊規范
下面是一個簡單的步驟指南來創建這樣一個公共模塊項目。
創建版本控制倉庫:使用版本控制工具(如Git)創建一個新的代碼倉庫,用于管理該公共模塊工程的代碼。
項目結構:定義好項目的結構,使其易于理解和使用。一個常見的Golang項目結構如下:
my-module/|- README.md # 項目文檔和說明|- go.mod # Go模塊定義文件|- go.sum # Go模塊的依賴版本文件|- cmd/ # 命令行應用程序目錄(如果有的話)|- pkg/ # 項目的庫代碼目錄|- internal/ # 內部庫代碼目錄,不對外公開|- examples/ # 示例代碼目錄|- tests/ # 單元測試和集成測試目錄
-
Go模塊初始化:進入項目根目錄,運行
go mod init <module-name>
來初始化 Go 模塊。模塊名稱應該是該模塊工程的唯一標識符。 -
編寫代碼:在
pkg/
目錄下編寫公共的Golang庫代碼。這些代碼應該是可復用的,不與具體應用邏輯綁定。 -
文檔和注釋:對于公共模塊,清晰的文檔和注釋是非常重要的。確保每個公共函數和類型都有良好的注釋,方便其他開發人員理解和使用。
-
示例代碼:在
examples/
目錄下提供一些簡單的示例代碼,展示如何使用這個公共模塊。 -
單元測試:編寫完整的單元測試和集成測試,保證模塊的正確性和穩定性。測試代碼放在
tests/
目錄下。 -
版本管理:在Go中,版本管理使用Go Modules。當你的模塊準備發布新版本時,確保適當地更新go.mod文件,并通過
go get <module-name>@<version>
或go mod tidy
來更新依賴關系。 -
持續集成:將公共模塊納入到企業的持續集成流程中,確保每次修改都通過了測試,并符合質量標準。
-
發布和文檔:根據企業內部的發布流程,發布新的版本,并及時更新項目文檔,方便其他開發人員使用。
以上是一個基本的指南來創建企業內部的Golang公共模塊工程,可根據實現項目靈活調整。記得在開發過程中關注代碼質量和安全性,并積極傾聽來自其他開發人員的反饋,不斷改進和優化模塊。
2、如何引入公共模塊
在Go中引入私有Git倉庫的包可以通過在 go.mod
文件中添加 replace
或 require
語句來實現,具體取決于你的使用場景。以下是引入私有Git倉庫包的三種常見方法。
在下述前兩種方法中,你需要將 github.com/yourusername/yourprivatepkg
替換為你私有Git倉庫的實際路徑,然后根據需要設置路徑或版本號。
完成后,運行 go mod tidy
命令來更新依賴。Go會自動下載和管理你的私有Git倉庫包。
2.1 私有項目的路徑替換
使用 replace
語句實現。
如果你希望在開發過程中使用本地路徑或其他方式替代私有Git倉庫,可以使用 replace
語句。這樣可以方便地在不同環境中進行開發和測試。
如果私有項目 A 依賴另一個私有項目 B,且通過 go get
無法獲取權限,可以采用 replace
方式。
在你的項目的 go.mod
文件中添加類似如下的 replace
語句,將私有Git倉庫的路徑替換為本地路徑或其他路徑:
replace github.com/yourusername/yourprivatepkg => /path/to/local/repo
或者,你可以使用相對路徑:
replace github.com/yourusername/yourprivatepkg => ../path/to/local/repo
2.2 go mod私有項目的訪問
使用 require
語句實現。
如果你想直接從私有Git倉庫獲取包并將其添加到項目依賴中,可以使用 require
語句。
在你的項目的 go.mod
文件中添加類似如下的 require
語句,將私有Git倉庫的路徑和版本號添加到依賴中:
require github.com/yourusername/yourprivatepkg v1.0.0
要實現上述方式,需要額外的配置,確保能夠正常 go get
私有Git倉庫的工程。
-
設置 Go GOPRIVATE 變量
# 配置多個私有項目地址 go env -w GOPRIVATE="gitlab.example.com" # 其中gitee.com/user 是你的個人賬戶所在地址
-
默認情況下,如果設置GOPRIVATE,會自動設置GONOPROXY和GONOSUMDB配置;
-
Golang項目非代理NOPROXY配置
如果設置GONOPROXY和GONOSUMDB均為none,意味著所有module,不管是公共的還是私有的,都要經過proxy下載,經過sumdb驗證。
-
-
私有倉庫的請求認證
方法一:在請求URL中嵌入認證信息
git config --global url."https://${user}:${password}@gitlab.example.com".insteadOf "https://gitlab.example.com"
Git全局配置查看和刪除:
#查看git全局配置 git config --global -l # 刪除url路徑替換, 或是修改${GitProject}/.git/config文件中對應url git config --global --unset url."git@gitlab.example.com".insteadOf
方法二:使用SSH替換HTTPS進行認證
git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com"
-
Golang私有項目的http訪問
如果私有庫不支持https協議,會報如下的錯誤。這是因為Go更新依賴時,會強制校驗CA證書來確保依賴庫的安全性。
go: gitee.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "gitee.com/modules/project": https fetch: Get "https://gitee.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused
如果私有庫不支持https協議,還需要go配置參數或環境變量,使其使用http方式訪問。
方法一:go get -insecure
使用
go get -insecure
,這種方式不推薦,原因如下:-
添加 `-insecure`` 參數,即表示更新依賴時可以不去校驗CA證書,但是這會帶來一個問題:范圍無法界定(overkill),所有與要更新依賴相關聯的依賴,均不會去做校驗,可能會意外更新到不安全的依賴。
-
-insecure
僅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令時是無法更新不支持https協議的私有庫的。
方法二:GOINSECURE
添加
GOINSECURE
參數,推薦這種方式。-
在Go 1.14 中增加了新的環境變量,用于指定哪些域名下的倉庫不去校驗 CA 證書。
-
使用方式同
GOINSECURE
類似go env -w GOINSECURE=gitlab.example.com
。
-
2.3 git 子模塊(推薦)
在 Go 中,你可以使用 Git 子模塊的方式引用私有的公共模塊工程,以便在你的項目中使用。
-
創建 Git 子模塊
在你的項目中,使用以下命令添加 Git 子模塊,將私有的公共模塊工程作為子模塊引入:
git submodule add <repository-url> path/to/submodule
其中
<repository-url>
是你私有模塊工程的 Git 倉庫 URL,path/to/submodule
是子模塊在你的項目中的路徑。 -
配置認證
如果你的私有模塊工程需要身份驗證,你可能需要在執行
go get
或go mod
時提供適當的認證憑證。這可能包括用戶名、密碼、Personal Access Token(如果使用 GitLab)等。 -
使用子模塊的包
在你的項目中,可以通過
import
語句引入子模塊的包,然后在代碼中使用這些包。import ("your/repo/path/to/submodule/package" )func main() {// 使用子模塊的包submodulepackage.DoSomething() }
-
使用 Go Modules 進行版本管理
確保你的項目啟用了 Go Modules,并在
go.mod
文件中添加了子模塊的引用。go mod edit -replace=example.com/submodule=path/to/submodule
-
更新子模塊
如果子模塊的工程代碼發生變化,你可以進入子模塊目錄,使用
git pull
更新子模塊的代碼。然后在你的項目根目錄使用go mod tidy
更新模塊依賴。
3、總結
條條道路通羅馬,技術更是如此。
具體選擇那種取決于你的實際環境、實際場景,這里只提供一個思路、方向供大家參考。
參考文章:
- Go Mod引用私有庫
- 怎么讓Go Modules使用私有依賴模塊
- Git: submodule 子模塊簡明教程