前提
go版本為1.13及以上
官方文檔
如果你想更深層次的了解GO MODULE的意義及開發者們的顧慮,可以直接訪問官方文檔(EN)
https://github.com/golang/go/wiki/Modules
go module介紹
go module是go官方自帶的go依賴管理庫,在1.13版本正式推薦使用
go module可以將某個項目(文件夾)下的所有依賴整理成一個 go.mod 文件,里面寫入了依賴的版本等
使用go module之后我們可不用將代碼放置在src下了
使用 go module 管理依賴后會在項目根目錄下生成兩個文件 go.mod 和 go.sum。
go.mod 中會記錄當前項目的所依賴,文件格式如下所示:
module github.com/gosoon/audit-webhook
go 1.12
require (
github.com/elastic/go-elasticsearch v0.0.0
github.com/gorilla/mux v1.7.2
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81
)
go.sum記錄每個依賴庫的版本和哈希值,文件格式如下所示:
github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA=
github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg=
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81 h1:JP0LU0ajeawW2xySrbhDqtSUfVWohZ505Q4LXo+hCmg=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81/go.mod h1:1e0N9vBl2wPF6qYa+JCRNIZnhxSkXkOJfD2iFw3eOfg=
開啟go module
(1) go 版本 >= v1.11
(2) 設置GO111MODULE環境變量
要使用go module 首先要設置GO111MODULE=on,GO111MODULE 有三個值,off、on、auto,off 和 on 即關閉和開啟,auto 則會根據當前目錄下是否有 go.mod 文件來判斷是否使用 modules 功能。無論使用哪種模式,module 功能默認不在 GOPATH 目錄下查找依賴文件,所以使用 modules 功能時請設置好代理。
在使用 go module 時,將 GO111MODULE 全局環境變量設置為 off,在需要使用的時候再開啟,避免在已有項目中意外引入 go module。
windows:
set GO111MODULE=on
mac:
export GO111MODULE=on
然后輸入
go env
查看 GO111MODULE 選項為 on 代表修改成功
GO PROXY
go module 的目的是依賴管理,所以使用 go module 時你可以舍棄 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平時沒有必要使用)
因go的網絡問題, 所以推薦使用 goproxy.cn設置
// 阿里雲鏡像
GOPROXY=https://mirrors.aliyun.com/goproxy/
// 中國golang鏡像
GOPROXY=https://goproxy.io
// 七牛雲為中國的gopher提供了一個免費合法的代理goproxy.cn,其已經開源。只需一條簡單命令就可以使用該代理:
go env -w GOPROXY=https://goproxy.cn,direct
初始化
為你的項目第一次使用 GO MODULE(項目中還沒有go.mod文件)
進入你的項目文件夾
cd xxx/xxx/test/
初始化 MODULE
go mod init test(test為項目名)
我們會發現在項目根目錄會出現一個 go.mod 文件
注意,此時的 go.mod 文件只標識了項目名和go的版本,這是正常的,因為只是初始化了
檢測依賴
go mod tidy
tidy會檢測該文件夾目錄下所有引入的依賴,寫入 go.mod 文件
寫入后你會發現 go.mod 文件有所變動
例如:
module test
go 1.13
require (
github.com/gin-contrib/sessions v0.0.1
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.4.0
github.com/go-redis/redis v6.15.6+incompatible
github.com/go-sql-driver/mysql v1.4.1
github.com/golang/protobuf v1.3.2 // indirect
github.com/jinzhu/gorm v1.9.11
github.com/json-iterator/go v1.1.7 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/mattn/go-isatty v0.0.10 // indirect
github.com/sirupsen/logrus v1.2.0
github.com/ugorji/go v1.1.7 // indirect
golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect
gopkg.in/yaml.v2 v2.2.4
)
此時依賴還是沒有下載的
下載依賴
我們需要將依賴下載至本地,而不是使用 go get
go mod download
如果你沒有設置 GOPROXY 為國內鏡像,這步百分百會卡到死
此時會將依賴全部下載至 GOPATH 下,會在根目錄下生成 go.sum 文件, 該文件是依賴的詳細依賴, 但是我們開頭說了,我們的項目是沒有放到 GOPATH 下的,那么我們下載至 GOPATH 下是無用的,照樣找不到這些包
導入依賴
go mod vendor
執行此命令,會將剛才下載至 GOPATH 下的依賴轉移至該項目根目錄下的 vendor(自動新建) 文件夾下, 此時我們就可以使用這些依賴了
goland設置開啟 Go Module
可能是因為 GO MODULE 功能還需完善,GOLAND默認是關閉該功能的,我們需要手動打開(不排除之后更新會不會改成默認開啟)
打開設置Go->打開折疊->選擇Go Modules(vgo)->選中兩個復選框,在Proxy選擇框中填入鏡像源
依賴更新
這里的更新不是指版本的更新,而是指引入新依賴
依賴更新請從檢測依賴部分一直執行即可,即
go mod tidy
go mod download
go mod vendor
使用go get 升級依賴
- 升級 major 版本:
go get -u github.com/xxx/xxx
- 升級全部依賴的 minor 或 patch 版本:
go get -u
- 升級全部依賴的 patch 版本:
go get -u=patch
Major:具有相同名稱但不同主版本號的程序集不可互換。例如,這適用於對產品的大量重寫,這些重寫使得無法實現向后兼容性。
Minor:如果兩個程序集的名稱和主版本號相同,而次版本號不同,這指示顯著增強,但照顧到了向后兼容性。例如,這適用於產品的修正版或完全向后兼容的新版本。
Patch:指系統或軟件的補丁,是為了完善系統或開發的軟件而開發的程序或代碼。
Build:內部版本號的不同表示對相同源所作的重新編譯。這適合於更改處理器、平台或編譯器的情況。
Revision:名稱、主版本號和次版本號都相同但修訂號不同的程序集應是完全可互換的。這適用於修復以前發布的程序集中的安全漏洞。
新增依賴
有同學會問,不使用 go get ,我怎么在項目中加新包呢?
直接項目中 import 這個包,之后更新依賴即可
使用 go get 添加依賴
- 添加依賴
go get github.com/xxx/xxx
- 添加指定版本:
go get github.com/xxx/xxx@v1.6.2
- 添加指定版本范圍:
go get github.com/xxxx/xxx@'<v1.6.2'
- 添加指定commit的版本
git commit: go get github.com/xxxx/xxx@q2516faf3
在協作中使用 GO MODULE
要注意的是, 在項目管理中,如使用git,請將 vendor 文件夾放入白名單,不然項目中帶上包體積會很大
git設置白名單方式為在git托管的項目根目錄新建 .gitignore 文件
設置忽略即可.
但是 go.mod 和 go.sum 不要忽略
另一人clone項目后在本地進行依賴更新(同上方依賴更新)即可
GOMODULE常用命令
go mod init # 初始化go.mod
go mod tidy # 更新依賴文件
go mod download # 下載依賴文件
go mod vendor # 將依賴轉移至本地的vendor文件
go mod edit # 手動修改依賴文件
go mod graph # 打印依賴圖
go mod verify # 校驗依賴