Go語言的包管理經過了多種工具的演變,上一節中我們通過配置GOPATH來存放源代碼進行包的管理,其實稱不上包管理,在起初開發的時候我們會把我們一個系統依賴的全部源代碼下載到src目錄,當多個 系統依賴不同版本的代碼庫時,處理起來十分的麻煩。所以,Go的包管理一致受到開發者的詬病。后來社區出現了幾個針對Go開發的包管理工具。
從Godep包管理工具到glide,直至go1.5版本引入go vender機制才有了基本的包管理能力,govender的引入也是實驗性質的,也就是說直至go1.5版本都沒有出來一個正式的包管理工具。隨著go1.11的正式發布go modules試探性的成為官方認可的包管理工具,在這個版本的發行中正式包含的go mod 工具包,開始對go 模塊化管理有了初步的支持,不過開發者還需要進行一定的配置才能使用gomod工具。
Go modules是官方推出推薦的GOPATH的一個替代方案,同時集成了對版本控制和包分發的支持。隨著go1.11推出后,還是有很多的問題。官網不斷在社區收集開發者反饋的問題,繼續進行優化修bug。到go1.12 gomod還是未默認將gomod設置為包管理工具取代GOPATH。在go1.11和go1.12版本中,因為沒有將gomod設置為默認包管理方式,增加了一個臨時環境變量GO111MODULE來控制使用方式。這個環境變量有三種設置方式:off、on、auto
off,則go命令從不使用go modules的功能,在執行go命令時將繼續在GOPATH中查找依賴包,繼續使用老的GOPATH模式;
auto,當go源碼不在GOPATH路徑下且當前目錄或者上層目錄存在go.mod文件時,啟用gomod模式,否則將使用GOPATH模式。
on,則go命令使用go mod模式,命令執行過程中將忽略GOPATH的設置,按照gomod的方式管理go程序;
在gomod模式下,開發的項目下載的依賴包還是會存儲到GOPATH/pkg/mod目錄下,編譯生成的二進制文件也將會存放到GOPATH/bin/ 目錄下。
可以通過 go help modules命令查看關于go mod的更多信息,也可以直接訪問https://github.com/golang/go/wiki/Modules?獲取更多信息。
今天我們已經處在了go1.12、go1.13的時代了,我們可以毫無顧忌的使用go modules了,也不必再糾結選用哪個包管理工具了。也不必去浪費時間學習其他的包管理工具,讓我們開始學習go modules的使用。
go mod命令介紹
download? ? 下載依賴的包到本地緩存目錄
edit? ? ? ? 編輯go.mod文件
graph? ? ? 打印模塊輸出圖
init? ? ? ?初始化modules項目
tidy? ? ? ? 添加缺失的依賴或者移除未使用的依賴
vendor? ? ? 生成vendor依賴目錄
verify? ? ? 驗證依賴是否正確
why? ? ? ? 解釋為什么需要相關依賴
當項目運行在go mod模式下時,執行go相關的命令run build test get等會下載或者更新項目依賴的包。
使用go mod構建項目
目前我們go版本是1.11.13,需要通過兩個臨時的環境變量設置默認支持go mod模式:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
設置GOPROXY,是讓我們更方面的下載那些由于國內網絡原因無法下載的依賴包。
首先,我們創建一個不同于GOPATH的目錄,用于gomod模式項目的開發:
mkdir -p /Users/tl/work/gomodapps
mkdir -p github.com/pk3589/modexample/
初始化
go mod init modexample/
因為我們下面分析的項目時以gin為基礎構建的,所以我們直接以引用gin包為例說明,
vi example.go? ?輸入
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
執行go mod tidy,我們看到已經在gomod模式下自動下載了項目所依賴的相關包
執行 go run example.go,啟動web服務。
打開瀏覽器訪問http://localhost:8080/ping? 響應返回json數據pong
至此,我們已經會使用go mod 構建項目了。
通過GoLand打開我們剛才構建的項目,
多看一點
剛才我們提到,在gomod的模式下,項目依賴仍然會下載到GOPATH目錄下,下面我們看一下我們構建的modexample項目下載的依賴是不是在GOPATH下,
執行 go install,
交叉編譯,很多時候項目的開發環境是windows或者mac,而我們實際生產環境卻是linux,這時我們就用到的go為我們提供的交叉編譯功能,只需執行相關的命令就能在我們開發環境生成目標環境的可執行文件:比如生成linux環境下的可執行文件
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build example.go
本節完。