這是一篇很短的文章,訴說着高效的包管理工具 go mod
我們上次說過如何讓一個項目在 Goland
編譯器跑起來,但是要自己去下包,要花不少時間找包下包,是不是很麻煩?
java
裏有一個叫 maven
的包管理工具, go
也有一個叫 go mod
的管理工具,可以管理項目引用的第三方包版本、自動識別項目中用到的包、自動下載和管理包。
怎麼用?
找到你的項目,直接執行
go mod init main.go
執行完會自動識別項目中用到的第三方包,並生成一個 go.mod
文件
$ cat go.mod
module collector_go
go 1.14
require (
github.com/gogo/protobuf v1.3.1 // indirect
github.com/golang/protobuf v1.4.2
google.golang.org/protobuf v1.23.0
)
然後直接 build
、 run
就會自動下載包啦~!
go build -o ./collector_go main.go
有一個小前提
golang>=1.12
添加環境變量 GO111MODULE
爲 on
或者 auto
,設置方法
go env GO111MODULE=on
他解決了什麼問題?
原來的包管理方式
- 在不使用額外的工具的情況下,
Go
的依賴包需要手工下載, - 第三方包沒有版本的概念,如果第三方包的作者做了不兼容升級,會讓開發者很難受
- 協作開發時,需要統一各個開發成員本地
$GOPATH/src
下的依賴包 - 引用的包引用了已經轉移的包,而作者沒改的話,需要自己修改引用。
- 第三方包和自己的包的源碼都在
src
下,很混亂。對於混合技術棧的項目來說,目錄的存放會有一些問題
新的包管理模式解決了以上問題
- 自動下載依賴包
- 項目不必放在
$GOPATH/src
內了 - 項目內會生成一個
go.mod
文件,列出包依賴 - 所以來的第三方包會準確的指定版本號
- 對於已經轉移的包,可以用
replace
申明替換,不需要改代碼
tips
Q1: 我的包下哪去了?
A: 依賴的第三方包被下載到了 $GOPATH/pkg/mod
路徑下。
Q2: GO111MODULE
的三個參數 auto
、 on
、 off
有什麼區別?
A: auto
根據是否在 src
下自動判定, on
只用 go.mod
, off
只用 src
。
Q3: 依賴包中的地址失效了怎麼辦?比如 golang. org/x/… 下的包都無法下載怎麼辦?
A: 在 go.mod
文件裏用 replace
替換包,例如
replace golang.org/x/text => github.com/golang/text latest
這樣, go
會用 github.com/golang/text
替代 golang.org/x/text
Q4: 在 go mod
模式中,項目自己引用自己中的某些模塊怎麼辦?
A: go.mod
文件裏的第一行會申明 module main
,把這個 main
改爲你的項目名,引用的時候就 import "項目名/模塊名"
即可。
根據官方的說法,從
Go 1.13
開始,模塊管理模式將是 Go 語言開發的默認模式。
參考掘金:https://juejin.im/post/5c9c8c4fe51d450bc9547ba1