日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang包管理解决之道——go modules初探

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang包管理解决之道——go modules初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

golang的包管理是一直是為人詬病之處,從golang1.5引入的vendor機制,到準官方工具dep,目前為止還沒一個簡便的解決方案。

不過現在go modules隨著golang1.11的發布而和我們見面了,這是官方提倡的新的包管理,乃至項目管理機制,可以不再需要GOPATH的存在。

?

go modules的初始化

現在modules機制仍在早期階段,所以golang提供了一個環境變量“GO111MODULE”,默認值為auto,如果當前目錄里有go.mod文件,就使用go modules,否則使用舊的GOPATH和vendor機制,因為在modules機制下go get只會下載go modules,這一行為會在以后版本中成為默認值,這里我們保持auto即可,如果你想直接使用modules而不需要從GOPATH過度,那么把“GO111MODULE”設置為on。

modules和傳統的GOPATH不同,不需要包含例如src,bin這樣的子目錄,一個源代碼目錄甚至是空目錄都可以作為module,只要其中包含有go.mod文件。

我們就用一個空目錄來創建我們的第一個module:

要初始化modules,需要使用如下命令(假設已經安裝配置好golang1.11):

go?mod?init?[module?name]

我們的module叫test,所以就是:

go?mod?init?test

初始完成后會在目錄下生成一個go.mod文件,里面的內容只有一行“module test”。

?

包管理

那么我們怎么進行包管理呢?別擔心,當我們使用go build,go test以及go list時,go會自動得更新go.mod文件,將依賴關系寫入其中。

如果你想手動處理依賴關系,那么使用如下的命令:

go?mod?tidy

這條命令會自動更新依賴關系,并且將包下載放入cache。

下面我們使用chromedp的一個簡單example作為實驗代碼main.go,看下go modules是如何處理包的依賴關系的。

我們手動運行go mod tidy:

查找并下載包

我們發現多了一個go.sum,我們看看它里面是什么內容:

沒錯,你已經猜到了,這是我們直接引用的package和它自身需要的以來的版本記錄,go modules就是根據這些去找到需要的packages的。

順帶一提,如果我們不做任何修改,默認會使用最新的包版本,如果包打過tag,那么就會使用最新的那個tag對應的版本。

下面我們使用go build來編譯我們的代碼:

go?build

值得注意的是,新增了一個編譯選項“-mod”,它有如下的可選值:

go?build?-mod=readonly

在這個模式下任何會導致依賴關系變動的情況都將導致build失敗,前面提到過build能查找并更新依賴關系,使用這個選項可以檢查依賴關系的變動。

go?build?-mod=vendor

意思是忽略cache里的包,只使用vendor目錄里的版本。

構建完成后目錄結構如下:

我們的代碼成功構建了,包管理都由go modules替我們完成了。

?

包的版本控制

包管理的另外一項重要功能就是包的版本控制。modules同樣可以做到。

在介紹版本控制之前,我們要先明確一點,如果上層目錄和下層目錄的go.mod里有相同的package規則,那么上層目錄的無條件覆蓋下層目錄,目的是為了main module的構建不會被依賴的package所影響。

那么我們看看go.mod長什么樣:

module?testrequire?github.com/chromedp/chromedp?v0.1.2

如果有多個依賴,可以是這樣的:

module?github.com/chromedp/chromedprequire?(github.com/chromedp/cdproto?v0.0.0-20180713053126-e314dc107013github.com/disintegration/imaging?v1.4.2github.com/gorilla/websocket?v1.2.0github.com/knq/sysutil?v0.0.0-20180306023629-0218e141a794github.com/mailru/easyjson?v0.0.0-20180606163543-3fdea8d05856golang.org/x/image?v0.0.0-20180708004352-c73c2afc3b81 )

前面部分是包的名字,也就是import時需要寫的部分,而空格之后的是版本號,版本號遵循如下規律:

vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef vX.0.0-yyyymmddhhmmss-abcdefabcdef vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef vX.Y.Z

也就是版本號+時間戳+hash,我們自己指定版本時只需要制定版本號即可,沒有版本tag的則需要找到對應commit的時間和hash值。

默認使用最新版本的package。

現在我們要修改依賴關系了,我們想使用chromedp 的v0.1.0版本,怎么辦呢?

只需要如下命令:

go?mod?edit?-require="github.com/chromedp/chromedp@v0.1.0"

@后面加上你需要的版本號。go.mod已經修改了:

module?testrequire?github.com/chromedp/chromedp?v0.1.0

我們還需要讓go modules更新依賴關系,這里我們手動go mod tidy之后:

注意顏色較深的那兩行,我們已經切換到了v0.1.0版本了。

?

go modules是一個很大的主題,以后我還將進一步介紹它。

因為go1.11剛發布不久,這篇文件作為探路,必定會有錯誤和疏漏,歡迎大家指正!

原文出處:https://www.cnblogs.com/apocelipes/p/9534885.html


作者:慕尼黑8549860
鏈接:http://www.imooc.com/article/74033
來源:慕課網

總結

以上是生活随笔為你收集整理的golang包管理解决之道——go modules初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。