go mod


go module是 Go1.11版本之后官方推出的版本管理工具,並且從Go1.13版本開始,go module將是Go語言默認的依賴管理工具。

GO111MODULE

要啟用go module支持首先要設置環境變量GO111MODULE,通過它可以開啟或關閉模塊支持,它有三個可選值:off、on、auto,默認值是auto。

  1. GO111MODULE=off禁用模塊支持,編譯時會從GOPATH和vendor文件夾中查找包。

  2. GO111MODULE=on啟用模塊支持,編譯時會忽略GOPATH和vendor文件夾,只根據 go.mod下載依賴。

  3. GO111MODULE=auto,當項目在$GOPATH/src外且項目根目錄有go.mod文件時,開啟模塊支持。

簡單來說,設置GO111MODULE=on之后就可以使用go module了,以后就沒有必要在GOPATH中創建項目了,並且還能夠很好的管理項目依賴的第三方包信息。

使用 go module 管理依賴后會在項目根目錄下生成兩個文件go.mod和go.sum。

GOPROXY

Go1.11之后設置GOPROXY命令為:

1 export GOPROXY=https://goproxy.cn

Go1.13之后GOPROXY默認值為https://proxy.golang.org,在國內是無法訪問的,所以十分建議大家設置GOPROXY,這里我推薦使用goproxy.cn

go env -w GOPROXY=https://goproxy.cn,direct

go mod命令

常用的go mod命令如下:

  1. go mod download 下載依賴的module到本地cache(默認為$GOPATH/pkg/mod目錄)
  2. go mod edit 編輯go.mod文件
  3. go mod graph 打印模塊依賴圖
  4. go mod init 初始化當前文件夾, 創建go.mod文件
  5. go mod tidy 增加缺少的module,刪除無用的module
  6. go mod vendor 將依賴復制到vendor下
  7. go mod verify 校驗依賴
  8. go mod why 解釋為什么需要依賴

go.mod

go.mod文件記錄了項目所有的依賴信息,其結構大致如下:

module test 
go 1.15  
require (  
		github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586 
		github.com/gin-gonic/gin v1.4.0   		
		github.com/go-sql-driver/mysql v1.4.1 
    github.com/jmoiron/sqlx v1.2.0 10 
    github.com/satori/go.uuid v1.2.0 
    google.golang.org/appengine v1.6.1 // indirect 12 
)

其中,

  • module用來定義包名

  • require用來定義依賴包及版本

  • indirect表示間接引用

依賴的版本

go mod支持語義化版本號,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,當然也可以跟git提交哈希,比如go get foo@e3702bed2。關於依賴的版本支持以下幾種格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 
gopkg.in/vmihailenco/msgpack.v2 v2.9.1 gopkg.in/yaml.v2 v2.2.1 
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e latest

replace

在國內訪問golang.org/x的各個包都需要***,你可以在go.mod中使用replace替換成github上對應的庫。

replace (  
	golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac  
	golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d  
	golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0 
)

go get

在項目中執行go get命令可以下載依賴包,並且還可以指定下載的版本。

  1. 運行go get -u將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)

  2. 運行go get -u=patch將會升級到最新的修訂版本

  3. 運行go get package@version將會升級到指定的版本號version

如果下載所有依賴可以使用go mod download命令。

整理依賴

我們在代碼中刪除依賴代碼后,相關的依賴庫並不會在go.mod文件中自動移除。這種情況下我們可以使用go mod tidy命令更新go.mod中的依賴關系。

go mod edit

格式化

因為我們可以手動修改go.mod文件,所以有些時候需要格式化該文件。Go提供了一下命令:

go mod edit -fmt

添加依賴項

go mod edit -require=golang.org/x/text

移除依賴項

如果只是想修改go.mod文件中的內容,那么可以運行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:

go mod edit -droprequire=golang.org/x/text

關於go mod edit的更多用法可以通過go help mod edit查看。

在項目中使用go module

既有項目

如果需要對一個已經存在的項目啟用go module,可以按照以下步驟操作:

  1. 在項目目錄下執行go mod init,生成一個go.mod文件。

  2. 執行go get,查找並記錄當前項目的依賴,同時生成一個go.sum記錄每個依賴庫的版本和哈希值。

新項目

對於一個新創建的項目,我們可以在項目文件夾下按照以下步驟操作:

  1. 執行go mod init 項目名命令,在當前項目文件夾下創建一個go.mod文件。

  2. 手動編輯go.mod中的require依賴項或執行go get自動發現、維護依賴。

文章轉自


免責聲明!

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



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