什么是go module
go module是go1.11版本之后推出來的版本管理工具,並且在go1.13之后默認支持。使用go module之后可以輕松的幫你告別gopath,那么什么是gopath呢?
GOPATH
GOPATH是go的環境變量,設置GOPATH
vi /etc/profile export GOROOT=/usr/local/go #設置為go安裝的路徑 export GOPATH=$HOME/gocode #默認安裝包的路徑 export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
其中GOPATH包含3個子目錄,為
src
存放源代碼(比如:.go .c .h .s等)pkg
編譯時生成的中間文件(比如:.a)bin
編譯后生成的可執行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個gopath,那么使用${GOPATH//://bin:}/bin
添加所有的bin目錄)
環境准備
go1.11版本后啟用go module需要開啟GO11MODULE,並且確保項目不在GOPATH中。設置參數為on, off, auto
111MODULE=off
禁用模塊支持,編譯時會從GOPATH
和vendor
文件夾中查找包。GO111MODULE=on
啟用模塊支持,編譯時會忽略GOPATH
和vendor
文件夾,只根據go.mod
下載依賴。GO111MODULE=auto
,當項目在$GOPATH/src
外且項目根目錄有go.mod
文件時,開啟模塊支持。
當參數設置為on,開啟成功。使用時會生成go.mod和go.sum兩個文件。
加速下載,設置GOPROXY
go1.11版本后可設置: export GOPROXY=https://goproxy.cn go 1.13版本默認為: export GOPROXY=https://proxy.golang.or(在國內很慢) 所有我一般設置為https://goproxy.cn 或阿里源 https://mirrors.aliyun.com/goproxy/
初始化
常用命令
go mod download 下載依賴的module到本地cache(默認為$GOPATH/pkg/mod目錄) go mod edit 編輯go.mod文件 go mod graph 打印模塊依賴圖 go mod init 初始化當前文件夾, 創建go.mod文件 go mod tidy 增加缺少的module,刪除無用的module go mod vendor 將依賴復制到vendor下 go mod verify 校驗依賴 go mod why 解釋為什么需要依賴
比如對於從git拉取到本地的項目可直接使用go mod tidy生成依賴包。而對於一個新項目,則可使用go mod init 初始化
go mod vender
go mod vendor
會復制modules下載到vendor中, 貌似只會下載你代碼中引用的庫,而不是go.mod中定義全部的module。
go get & replace
對於項目中的新包可以使用go get 去下載。如
- 運行
go get -u
將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號) - 運行
go get -u=patch
將會升級到最新的修訂版本 - 運行
go get package@version
將會升級到指定的版本號version
replace本地包替換
基於國內防火牆的問題,可以使用,如
replace packagepath/pkg v0.0.0 => github.com/packagepath/pkg v0.0.0
godep
在引用go mod 之前。go采用godep來管理目錄。或者直接本地GOPATHL路徑(GOPATH過於繁瑣)
安裝
go get github.com/tools/godep
使用時會引用一個vendor目錄,這樣代碼會首先去查找vendor目錄
├── Gopkg.lock ├── Gopkg.toml ├── main.go └── vendor ├── github.com │ ├── gin-contrib │ ├── gin-gonic │ ├── golang │ ├── mattn │ └── ugorji ├── golang.org │ └── x └── gopkg.in ├── go-playground
常用命令
godep save 將依賴項輸出並復制到Godeps.json文件中 godep go 使用保存的依賴項運行go工具 godep get 下載並安裝具有指定依賴項的包 godep path 打印依賴的GOPATH路徑 godep restore 在GOPATH中拉取依賴的版本 godep update 更新選定的包或go版本 godep diff 顯示當前和以前保存的依賴項集之間的差異 godep version 查看版本信息
比如你在新項目中使用godep save時會在當前項目中創建Godeps
和vender
兩個文件夾。
小結
在go1.13后默認支持go mod,所以還是最好使用go mod,並且管理項目也很方便快捷。
一般情況,go mod init 和 go mod tidy 兩個命令就夠用了。