更新、更全的《Go從入門到放棄》的更新網站,更有python、go、人工智能教學等着你: https://www.cnblogs.com/nickchen121/p/11517502.html
Go語言的依賴管理隨着版本的更迭正逐漸完善起來。
一、依賴管理
二、為什么需要依賴管理
最早的時候,Go所依賴的所有的第三方庫都放在GOPATH這個目錄下面。這就導致了同一個庫只能保存一個版本的代碼。如果不同的項目依賴同一個第三方的庫的不同版本,應該怎么解決?
三、godep
Go語言從v1.5開始開始引入vendor
模式,如果項目目錄下有vendor目錄,那么go工具鏈會優先使用vendor
內的包進行編譯、測試等。
godep
是一個通過vender模式實現的Go語言的第三方依賴管理工具,類似的還有由社區維護准官方包管理工具dep
。
3.1 安裝
執行以下命令安裝godep
工具。
go get github.com/tools/godep
3.2 基本命令
安裝好godep之后,在終端輸入godep
查看支持的所有命令。
godep save 將依賴項輸出並復制到Godeps.json文件中
godep go 使用保存的依賴項運行go工具
godep get 下載並安裝具有指定依賴項的包
godep path 打印依賴的GOPATH路徑
godep restore 在GOPATH中拉取依賴的版本
godep update 更新選定的包或go版本
godep diff 顯示當前和以前保存的依賴項集之間的差異
godep version 查看版本信息
使用godep help [command]
可以看看具體命令的幫助信息。
3.3 使用godep
在項目目錄下執行godep save
命令,會在當前項目中創建Godeps
和vender
兩個文件夾。
其中Godeps
文件夾下有一個Godeps.json
的文件,里面記錄了項目所依賴的包信息。 vender
文件夾下是項目依賴的包的源代碼文件。
3.4 vender機制
Go1.5版本之后開始支持,能夠控制Go語言程序編譯時依賴包搜索路徑的優先級。
例如查找項目的某個依賴包,首先會在項目根目錄下的vender
文件夾中查找,如果沒有找到就會去$GOAPTH/src
目錄下查找。
3.5 godep開發流程
- 保證程序能夠正常編譯
- 執行
godep save
保存當前項目的所有第三方依賴的版本信息和代碼 - 提交Godeps目錄和vender目錄到代碼庫。
- 如果要更新依賴的版本,可以直接修改
Godeps.json
文件中的對應項
四、go module
go module
是Go1.11版本之后官方推出的版本管理工具,並且從Go1.13版本開始,go module
將是Go語言默認的依賴管理工具。
4.1 GO111MODULE
要啟用go module
支持首先要設置環境變量GO111MODULE
,通過它可以開啟或關閉模塊支持,它有三個可選值:off
、on
、auto
,默認值是auto
。
GO111MODULE=off
禁用模塊支持,編譯時會從GOPATH
和vendor
文件夾中查找包。GO111MODULE=on
啟用模塊支持,編譯時會忽略GOPATH
和vendor
文件夾,只根據go.mod
下載依賴。GO111MODULE=auto
,當項目在$GOPATH/src
外且項目根目錄有go.mod
文件時,開啟模塊支持。
簡單來說,設置GO111MODULE=on
之后就可以使用go module
了,以后就沒有必要在GOPATH中創建項目了,並且還能夠很好的管理項目依賴的第三方包信息。
使用 go module 管理依賴后會在項目根目錄下生成兩個文件go.mod
和go.sum
。
4.2 GOPROXY
Go1.11之后設置GOPROXY命令為:
export GOPROXY=https://goproxy.cn
Go1.13之后GOPROXY
默認值為https://proxy.golang.org
,在國內是無法訪問的,所以十分建議大家設置GOPROXY,這里我推薦使用goproxy.cn。
go env -w GOPROXY=https://goproxy.cn,direct
4.3 go mod命令
常用的go mod
命令如下:
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 解釋為什么需要依賴
```
## go.mod
go.mod文件記錄了項目所有的依賴信息,其結構大致如下:
module github.com/Q1mi/studygo/blogger
go 1.12
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
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
```
其中,
module
用來定義包名
require
用來定義依賴包及版本
indirect
表示間接引用
### 4.3.1 依賴的版本
go mod支持語義化版本號,比如go get foo@v1.2.3
,也可以跟git的分支或tag,比如go get foo@master
,當然也可以跟git提交哈希,比如go get foo@e3702bed2
。關於依賴的版本支持以下幾種格式:
```go
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
```
### 4.3.2 replace
在國內訪問golang.org/x的各個包都需要翻牆,你可以在go.mod中使用replace替換成github上對應的庫。
```go
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
)
```
## 4.4 go get
在項目中執行go get
命令可以下載依賴包,並且還可以指定下載的版本。
- 運行
go get -u
將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
- 運行
go get -u=patch
將會升級到最新的修訂版本
- 運行
go get package@version
將會升級到指定的版本號version
如果下載所有依賴可以使用go mod download
命令。
## 4.5 整理依賴
我們在代碼中刪除依賴代碼后,相關的依賴庫並不會在go.mod
文件中自動移除。這種情況下我們可以使用go mod tidy
命令更新go.mod
中的依賴關系。
## 4.6 go mod edit
### 4.6.1 格式化
因為我們可以手動修改go.mod文件,所以有些時候需要格式化該文件。Go提供了一下命令:
```bash
go mod edit -fmt
```
### 4.6.2 添加依賴項
```bash
go mod edit -require=golang.org/x/text
```
### 4.6.3 移除依賴項
如果只是想修改go.mod
文件中的內容,那么可以運行go mod edit -droprequire=package path
,比如要在go.mod
中移除golang.org/x/text
包,可以使用如下命令:
```bash
go mod edit -droprequire=golang.org/x/text
```
關於go mod edit
的更多用法可以通過go help mod edit
查看。
# 五、在項目中使用go module
## 5.1 既有項目
如果需要對一個已經存在的項目啟用go module
,可以按照以下步驟操作:
- 在項目目錄下執行
go mod init
,生成一個go.mod
文件。
- 執行
go get
,查找並記錄當前項目的依賴,同時生成一個go.sum
記錄每個依賴庫的版本和哈希值。
## 5.2 新項目
對於一個新創建的項目,我們可以在項目文件夾下按照以下步驟操作:
- 執行
go mod init 項目名
命令,在當前項目文件夾下創建一個go.mod
文件。
- 手動編輯
go.mod
中的require依賴項或執行go get
自動發現、維護依賴。