Golang 從gopath到 go modules

一 前言

Golang是最近新學的語言。偶爾使用一下。屬實好用。golang默認使用gopath來管理jar包、

gopath 有一個很嚴重的問題。 當你本地開多個項目的時候,沒法讓不同項目對應不同的jar包版本。這樣很蛋疼的。如果引入的jar版本是不向下兼容的話,那開發的時候都可能會出現很多問題。比如我的jar有這個方法。你的沒有。很難玩的。

像java的maven是配置jar版本在pom.xml中、而go也有這麼個包管理工具  modules

二 Gopath

先寫一下gopath的用法吧。先看一下 go  env 展示的go的變量值。

其中 goRoot 是你go的SDK安裝路徑。go的默認包存放在這個目錄的src下。go的執行命令在 bin 目錄下。

只需將GoPath的位置配置在環境變量中就可以了。

你在程序中import導的包  通過  go get 就會下載到gopath中。gopath可以設置多個、按順序查找jar包。先找GoRoot,然後按照goPath的順序找、都沒有not found  然後你再下就可以了。

Gopath會將包文件下載到你配置的GOPATH環境變量的src文件夾下。

經常會遇到一種情況就是某個jar包被牆了。網絡不通下載不了。一般都會在GitHub中有該jar資源的、

比如  golang.org/x/net  這個go  get 如果沒有代理就會被牆。 取而代之:github.com/golang/net

goPath在我目前的使用大概就是這麼用的。它沒法區分版本。如果你變更版本就只能重新下載。然後將jar的原來位置覆蓋掉、或者如果在github中下的。可以通過 tag  或者  branch 切換一下jar的版本。非常的麻煩。

三 go mod

go mod  推薦 1.12版本及以後使用。據說1.11不太穩定有一些問題。

使用go mod 的第一步是設置開啓go modules 和設置代理
添加環境變量  
GO111MODULE = on       開啓之後。go get/ go mod download 等命令會下載到$GoPath/pkg目錄下的mod文件夾中。
GOPROXY = https://goproxy.cn   設置一個代理  七牛雲的CDN

go mod init projectName 來將項目初始化爲mod管理的項目。 或者在goland這種編輯器的 Go--modules設置一下代理。然後會自動下。
或者直接run  或者執行 go mod download/tidy 也會下載。

然後 $gopath/pkg下面就有了

go module 拉取package的原則是先拉取最新的release tag 若無tag 則拉取最新的commit

go.mod文件一旦創建後,它的內容將會被go toolchain全面掌控。go toolchain會在各類命令執行時,比如go get、go build、go mod等修改和維護go.mod文件。

go get package@version  可以升級包 對應的 go.mod/go.sum文件也會被修改。
例如執行 go get github.com/mattn/[email protected] 

可以在go.mod中使用replace代替被牆的包----指向可以下到的包地址。  如下

replace (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)

go mod 一共有四種指令。
module 模塊名稱  require 依賴包及版本  exclude 禁止的依賴包及其版本  replace 替換的依賴包列表 

這個module  模塊名稱是import時需要寫的。 對於不同的版本 在git庫中我們可以改完一版之後提一個tag並修改對應的module重寫提tag

go mod edit -require="github.com/golang/[email protected]"  主動修改mod的引用包版本。

go mod tidy  拉取缺少的模塊。移除不用的模塊。  這個神技 非常好用  go mod tidy -v  可以把沒引用到的剔除。

go.sum不是鎖文件。  是對包版本的一個校驗文件。

go mod graph 列出所有的包依賴關係、


go list -m all    列出當前模塊依賴的所有模塊
go list -u -m all    列出當前模塊依賴中可升級的模塊
go get -u    升級所有依賴至最新版本
go get -u=patch    升級所有依賴至最新的修訂版本
go mod tidy    清理未使用/生效的依賴
 

以上就是go  modules 的一些用法。使用起來非常簡單。不過沒找到包的時候需要go.mod寫一下  replace 相比maven就不方便了。但是與gopath和其他go的包管理比起來這個更是首推的。學這個沒錯的、

 

參考:

https://segmentfault.com/a/1190000018536993    

https://objcoding.com/2018/09/13/go-modules/

https://xuanwo.io/2019/05/27/go-modules/

發佈了54 篇原創文章 · 獲贊 25 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章