golang團隊在版本1.13及以後全面支持module機制,用於結束混亂複雜的項目管理機制。同學們可以簡單的將module機制理解成pip、apt-get等包管理工具。
一個項目(倉庫)包括多個module(模塊),一個模塊包括多個package(包),而一個包含多個代碼源文件。
簡單的說,在一個module中,module機制自動保證導入所有源文件中使用的標準庫和第三方包,而不用逐一go get;同時完成版本管理。
假設已安裝golang 1.13或更高版本,則默認開啓module機制,所以可以直接使用module相關的命令。
初始化module
通過go init初始化module後,在該目錄下生成go.mod文件,用於記錄項目中需要的第三方依賴的名稱和版本;由於項目中可能使用相同依賴的不同版本,所以文件根據名稱和版本進行區分。
另外會生成go.sum文件,用於記錄第三方依賴的校驗信息;當有項目交接、遷移等過程時,新的環境必須和go.sum中的記錄相同。所以當有版本控制時,go.mod和go.sum兩個文件一定要提交。
$:mkdirgo_module_test && cdgo_module_test
$:gomod init test
go: creating new go.mod: module test
$:catgo.mod
module test #module名稱
go 1.13 #go的版本
導入第三方依賴
之前通過go get來獲取第三方依賴,而基於module機制,只要在源碼中進行導入,通過go run/test/build等命令即可自動獲取並存儲到GOPATH/pkg下,那GOPATH是什麼呢?GOPATH可以認爲是工作目錄,在安裝go的時候會有默認值,可以通過命令查看:
go env | grep GOPATH
當然可以通過命令更改GOPATH目錄
go env -w GOPATH=/xxx/xxx/xxx
通過類似go build等命令,第三方依賴都會被下載到GOPATH/pkg目錄下。
例如,在test目錄下編寫如下源碼並執行:go run main.go
packagemain
import(
"fmt"
"rsc.io/quote"
)
funcmain() {
fmt.Println(quote.Hello())
}
大家可以發現兩點: 第一、GOPATH/pkg下有quote的第三方包; 第二、go.mod多了一行:require http://rsc.io/quote v1.5.2 // indirect。require是關鍵詞,其他的關鍵詞還有module、replace和exclude;v1.5.2是版本。
到這裏其實大家已經可以進行項目開發了,再簡單的介紹幾種命令,可能會用到。
go get:前面提到不需要用go get來獲取第三方依賴,但是module只能自動獲取特定格式的第三方依賴,而對其它非特定格式的第三方依賴依舊需要go get指令。
go get example.com/package //更新第三方依賴
go get -u example.com/package//下載最新版本的第三方依賴
go get example.com/[email protected] //下載特定版本的第三方依賴
go mod tidy:檢查所有依賴,刪除沒有使用的依賴。
自從推出module機制,同學們就能愉快的開發項目啦。