GoPath模式和GoMoudle模式的相愛相殺

2022-07-02 12:24:10 字數 2749 閱讀 1968

相信看我文章的文章的童鞋,golang版本已經是1.3版本以上。如果你的版本還停留在1.3以下,那這篇文章可以做為你的提公升之法。

gopath是什麼

gopath 是什麼,相信已經不用我再多說什麼了。大家深受摧殘多年,應該已經有所體會。在v.1.11版本之前,安裝go肯定要在環境變數中配置gopath,我們可以簡單的將其理解成是工作目錄。目錄結構如下

-- bin 存放編譯後生成的二進位制可執行檔案

-- pkg 存放編譯後生成的.a檔案

將你的包或者別人的包全部放在$gopath/src目錄下進行管理的方式,我們稱之為 gopath 模式。

gopath有什麼樣的問題?

版本管理問題

gopath 根本沒有版本的概念,如果你所應用的庫需要公升級,那就是全域性公升級,所以涉及這個庫的服務在下一次編譯中都會使用新的庫,這是一件很危險的事情。版本管理非常重要,自己應該管理好自己的引用庫。

協同開發問題

go modules 在 v1.11 版本正式推出,在發布的 v1.14 版本中,官方正式發話,稱其已經足夠成熟,可以應用於生產上。

從 v1.11 開始,go env多了個環境變數:go111module,這裡的 111,其實就是 v1.11 的象徵標誌, go 裡好像很喜歡這樣的命名方式,比如當初 vendor 出現的時候,也多了個go15vendorexperiment環境變數,其中 15,表示的vendor 是在 v1.5 時才誕生的。

go111module是乙個開關,通過它可以開啟或關閉 go mod 模式。

它有三個可選值:offonauto,預設值是auto

go111module=off禁用模組支援,編譯時會從gopathvendor資料夾中查詢包。

go111module=auto,當專案在$gopath/src外且專案根目錄有go.mod檔案時,自動開啟模組支援。

go mod 出現後, gopath(肯定沒人使用了) 和 govendor 將會且正在被逐步淘汰,但是若你的專案仍然要使用那些即將過時的包依賴管理方案,請注意將 go111module 置為 off。

具體怎麼設定呢?可以使用 go env 的命令,如我要開啟 go mod ,就使用這條命令

go env -w go111module="on"
go mod 使用

go mod 不再依靠 $gopath,使得它可以脫離 gopath 來建立專案

你可以在你電腦的任意位置建立乙個資料夾go_demo

使用 go mod 命令初始化,此時目錄下只有2個檔案,go.mod是執行命令後生成的檔案。

go mod init go_demo
檔案main.go解釋:引入乙個now的時間處理庫,輸出時間

)func main()

go.mod內容

module go_demo

go 1.15

require github.com/jinzhu/now v1.1.1

內容解釋:

此時我們在命令列執行go build進行編譯,發現多了乙個go.sum檔案,那麼這個檔案又是什麼?

go.sum 檔案相比go.mod就比較複雜了。雖然內容多,但是也不難理解。

每一行都是由模組路徑模組版本雜湊檢驗值組成,其中雜湊檢驗值是用來保證當前快取的模組不會被篡改。hash 是以h1:開頭的字串,表示生成checksum的演算法是第一版的hash演算法(sha256)。

go.mod 和 go.sum 是 go modules 版本管理的指導性檔案,因此 go.mod 和 go.sum 檔案都應該提交到你的 git 倉庫中去,避免其他人使用你寫專案時,重新生成的go.mod 和 go.sum 與你開發的基準版本的不一致。

go mod的好處

相比gopath的方式,go mod的好處顯而易見。你不必為了版本依賴費勁頭腦,模組化自動幫你做好了。這就有點c#中nuget的味道,node的npm的感覺。開發者不應為了這種事情操心,而應該專注於編碼問題。

go mod init:初始化go mod, 生成go.mod檔案,後可接引數指定 module 名,上面已經演示過。

go list -m -json all:以 json 的方式列印依賴詳情

一文搞懂 go modules

作者部落格|文章首發

本文到此結束,希望對你有幫助

ubuntu下GOROOT和GOPATH配置

更好的使用go,需要設定環境變數 sudo vim profile 在前面新增 export goroot usr lib go export gopath home gocode export path path gopath bin 原路徑後用冒號連線新路徑 如果要立刻生效,可以source e...

GOPATH設定和go get替換HTTPS的技巧

用go env可以檢視自己的goroot和gopath 針對go1.9以前的版本可以將goroot和gopath寫到配置檔案裡,以mac為例子 wujingcidemacbook pro wujingci cat bash profile export gopath home go export g...

Go 筆記一 工作區和GOPATH

包中可以任意個.go 副檔名的原始碼檔案,需要被宣告為屬於同乙個 包。包的名稱一般會與這些原始碼檔案所在的目錄同名。如果不同名,那麼在構建 安裝的過程中會以 包名稱為準。每個 包都會有匯入路徑。包的匯入路徑是其他 在使用該包中的程式實體時需要引入的路徑。在實際使用程式實體之前,我們必須先導入其所在的...