Go Module基礎
出現原因
- GOPATH不符合一般開發者的習慣; 大家習慣用maven, node module之類的方式.
- GOPATH無法有效管理板依賴, 沒有辦法表明所依賴的包的版本.
環境準備
- Go version >= 1.11
- GO111MODULE=on
GoMod effect immport package
- 可以在$GOPATH之外的地方建立專案
- 該專案Go Module開啟後, 下載的package會放在$GOPATH/pkg/mod下.
- $GOPATH/bin的功能依然保持
Go Mod Commands
有兩種方式能定義一個正確的Go module
1 |
// 在$GOPATH/src的目錄下, 建立合理的module路徑 |
就會在該專案下生出了go.mod文件了.
Syntax of go.mod
- module
- 定義模組路徑
- go
- 定義go version
- require
- 指定依賴的功能包和其版本或是[預設是最新版]
- exclude
- 忽略該功能包和其版本
- replace
- 替換依賴的功能包
1
2
3
4
5
6module my/package
go 1.12
require other/thing v1.0.2
require new/thing/v2 v2.3.4
exclude old/thing v1.2.3
replace bad/thing v1.4.5 => good/thing v1.4.5
- 替換依賴的功能包
Go Mod Require
- 安裝一下logrus
1
go get github.com/sirupsen/logrus
go.mod的內容
1 |
module modtest |
此時把v1.4.2 改成v1.4.1
執行
1 |
go mod download |
go.mod的內容
1 |
module modtest |
也會發生$GOPATH/pkg/mod/github.com/sirupsen目錄下,多了[email protected]和1.4.2版本的源碼
Go Mod Exclude
go.mod的內容
1 |
module modtest |
1 |
go get github.com/gin-gonic/gin大专栏 Go Module & Go Vendor> |
會發現應該是要下載當前最新板的v1.4.0的gin; 但因為有exclude gin 1.4.0 ;
所以改成下載v1.3.9
go.mod的內容
1 |
module modtest |
如果exclude指定gin的依賴功能包, 該功能包會避開該版號作安裝
Go Mod Replace
如果有package被replace, 則編譯時會使用對應的項目來作取代.
- 與require類似, 可以指向令一個repo
- 又或是指向本地的一個目錄
gomodtest
1 |
|
1 |
// modtest.go |
**gomaintest
1 |
|
1 |
// main.go |
執行結果
notes
- Replace和Exclude都只對當前這module有影響, 對其他功能包不會去影響到 ;
其他功能包自己的replace也不會影響到這包.