一 前言
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/