Go語言的包管理經(jīng)過了多種工具的演變,上一節(jié)中我們通過配置GOPATH來存放源代碼進(jìn)行包的管理墨技,其實(shí)稱不上包管理,在起初開發(fā)的時(shí)候我們會(huì)把我們一個(gè)系統(tǒng)依賴的全部源代碼下載到src目錄,當(dāng)多個(gè) 系統(tǒng)依賴不同版本的代碼庫時(shí)作烟,處理起來十分的麻煩。所以砾医,Go的包管理一致受到開發(fā)者的詬病拿撩。后來社區(qū)出現(xiàn)了幾個(gè)針對(duì)Go開發(fā)的包管理工具。
從Godep包管理工具到glide如蚜,直至go1.5版本引入go vender機(jī)制才有了基本的包管理能力压恒,govender的引入也是實(shí)驗(yàn)性質(zhì)的影暴,也就是說直至go1.5版本都沒有出來一個(gè)正式的包管理工具。隨著go1.11的正式發(fā)布go modules試探性的成為官方認(rèn)可的包管理工具探赫,在這個(gè)版本的發(fā)行中正式包含的go mod 工具包型宙,開始對(duì)go 模塊化管理有了初步的支持,不過開發(fā)者還需要進(jìn)行一定的配置才能使用gomod工具伦吠。
Go modules是官方推出推薦的GOPATH的一個(gè)替代方案妆兑,同時(shí)集成了對(duì)版本控制和包分發(fā)的支持。隨著go1.11推出后毛仪,還是有很多的問題搁嗓。官網(wǎng)不斷在社區(qū)收集開發(fā)者反饋的問題,繼續(xù)進(jìn)行優(yōu)化修bug箱靴。到go1.12 gomod還是未默認(rèn)將gomod設(shè)置為包管理工具取代GOPATH腺逛。在go1.11和go1.12版本中,因?yàn)闆]有將gomod設(shè)置為默認(rèn)包管理方式衡怀,增加了一個(gè)臨時(shí)環(huán)境變量GO111MODULE來控制使用方式屉来。這個(gè)環(huán)境變量有三種設(shè)置方式:off、on狈癞、auto
off茄靠,則go命令從不使用go modules的功能,在執(zhí)行g(shù)o命令時(shí)將繼續(xù)在GOPATH中查找依賴包蝶桶,繼續(xù)使用老的GOPATH模式慨绳;
auto,當(dāng)go源碼不在GOPATH路徑下且當(dāng)前目錄或者上層目錄存在go.mod文件時(shí)真竖,啟用gomod模式脐雪,否則將使用GOPATH模式。
on恢共,則go命令使用go mod模式战秋,命令執(zhí)行過程中將忽略GOPATH的設(shè)置,按照gomod的方式管理go程序讨韭;
在gomod模式下脂信,開發(fā)的項(xiàng)目下載的依賴包還是會(huì)存儲(chǔ)到GOPATH/pkg/mod目錄下,編譯生成的二進(jìn)制文件也將會(huì)存放到GOPATH/bin/ 目錄下透硝。
可以通過 go help modules命令查看關(guān)于go mod的更多信息狰闪,也可以直接訪問https://github.com/golang/go/wiki/Modules?獲取更多信息。
今天我們已經(jīng)處在了go1.12濒生、go1.13的時(shí)代了埋泵,我們可以毫無顧忌的使用go modules了,也不必再糾結(jié)選用哪個(gè)包管理工具了。也不必去浪費(fèi)時(shí)間學(xué)習(xí)其他的包管理工具丽声,讓我們開始學(xué)習(xí)go modules的使用礁蔗。
go mod命令介紹
download? ? 下載依賴的包到本地緩存目錄
edit? ? ? ? 編輯go.mod文件
graph? ? ? 打印模塊輸出圖
init? ? ? ?初始化modules項(xiàng)目
tidy? ? ? ? 添加缺失的依賴或者移除未使用的依賴
vendor? ? ? 生成vendor依賴目錄
verify? ? ? 驗(yàn)證依賴是否正確
why? ? ? ? 解釋為什么需要相關(guān)依賴
當(dāng)項(xiàng)目運(yùn)行在go mod模式下時(shí),執(zhí)行g(shù)o相關(guān)的命令run build test get等會(huì)下載或者更新項(xiàng)目依賴的包雁社。
使用go mod構(gòu)建項(xiàng)目
目前我們go版本是1.11.13瘦麸,需要通過兩個(gè)臨時(shí)的環(huán)境變量設(shè)置默認(rèn)支持go mod模式:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
設(shè)置GOPROXY,是讓我們更方面的下載那些由于國(guó)內(nèi)網(wǎng)絡(luò)原因無法下載的依賴包歧胁。
首先滋饲,我們創(chuàng)建一個(gè)不同于GOPATH的目錄,用于gomod模式項(xiàng)目的開發(fā):
mkdir -p /Users/tl/work/gomodapps
mkdir -p github.com/pk3589/modexample/
初始化
go mod init modexample/
因?yàn)槲覀兿旅娣治龅捻?xiàng)目時(shí)以gin為基礎(chǔ)構(gòu)建的喊巍,所以我們直接以引用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")
}
執(zhí)行g(shù)o mod tidy,我們看到已經(jīng)在gomod模式下自動(dòng)下載了項(xiàng)目所依賴的相關(guān)包
執(zhí)行 go run example.go崭参,啟動(dòng)web服務(wù)呵曹。
打開瀏覽器訪問http://localhost:8080/ping? 響應(yīng)返回json數(shù)據(jù)pong
至此,我們已經(jīng)會(huì)使用go mod 構(gòu)建項(xiàng)目了何暮。
通過GoLand打開我們剛才構(gòu)建的項(xiàng)目奄喂,
多看一點(diǎn)
剛才我們提到,在gomod的模式下海洼,項(xiàng)目依賴仍然會(huì)下載到GOPATH目錄下跨新,下面我們看一下我們構(gòu)建的modexample項(xiàng)目下載的依賴是不是在GOPATH下,
執(zhí)行 go install坏逢,
交叉編譯域帐,很多時(shí)候項(xiàng)目的開發(fā)環(huán)境是windows或者mac,而我們實(shí)際生產(chǎn)環(huán)境卻是linux是整,這時(shí)我們就用到的go為我們提供的交叉編譯功能肖揣,只需執(zhí)行相關(guān)的命令就能在我們開發(fā)環(huán)境生成目標(biāo)環(huán)境的可執(zhí)行文件:比如生成linux環(huán)境下的可執(zhí)行文件
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build example.go
本節(jié)完。