通過項(xiàng)目學(xué)習(xí)Go語言之go mod

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í)行mod命令

執(zhí)行 go run example.go崭参,啟動(dòng)web服務(wù)呵曹。


啟動(dòng)顯示日志

打開瀏覽器訪問http://localhost:8080/ping? 響應(yīng)返回json數(shù)據(jù)pong


訪問結(jié)果

至此,我們已經(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下,


gomod項(xiàng)目依賴包

執(zhí)行 go install坏逢,


生成的二進(jìn)制執(zhí)行文件

交叉編譯域帐,很多時(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é)完。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浮入,一起剝皮案震驚了整個(gè)濱河市龙优,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌事秀,老刑警劉巖彤断,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秽晚,居然都是意外死亡瓦糟,警方通過查閱死者的電腦和手機(jī)筒愚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赴蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巢掺,你說我怎么就攤上這事句伶【Ⅱ撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵考余,是天一觀的道長(zhǎng)先嬉。 經(jīng)常有香客問我,道長(zhǎng)楚堤,這世上最難降的妖魔是什么疫蔓? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮身冬,結(jié)果婚禮上衅胀,老公的妹妹穿的比我還像新娘。我一直安慰自己酥筝,他們只是感情好滚躯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘿歌,像睡著了一般掸掏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宙帝,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天丧凤,我揣著相機(jī)與錄音,去河邊找鬼步脓。 笑死息裸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沪编。 我是一名探鬼主播呼盆,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蚁廓!你這毒婦竟也來了访圃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤相嵌,失蹤者是張志新(化名)和其女友劉穎腿时,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饭宾,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡批糟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了看铆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽鼎。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出否淤,到底是詐尸還是另有隱情悄但,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布石抡,位于F島的核電站檐嚣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啰扛。R本人自食惡果不足惜嚎京,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隐解。 院中可真熱鬧挖藏,春花似錦捶码、人聲如沸枉层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袱蚓。三九已至傲宜,卻和暖如春犯建,著一層夾襖步出監(jiān)牢的瞬間诸狭,已是汗流浹背炸宵。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工辟躏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人土全。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓捎琐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裹匙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑞凑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容