基礎知識
環境準備
- 使用golang 1.11以上版本的朋友,開啓 GO11MODULE=on ,並且確保實驗目錄不在 GOPATH 中,命令行裏執行。
export GO11MODULE=on
export GO111MODULE=on
2.golang 1.12和golang 1.13的朋友,確保實驗目錄不在 GOPATH 中。
3.加速下載,命令行裏執行。
export GOPROXY=https://goproxy.io初始化go module環境
帶git的項目
- 直接從github上面clone一個項目下來。
- 直接執行 go mod init 會自動生成帶git地址的packagename
- 執行命令:
go mod init
不帶git的項目
直接執行go mod init packagename
下載依賴包go mod download
拉取必須模塊,移除不用的模塊go mod tidy
ps: - go get、 go run、go build 也會自動下載依賴
- 如果tag對應內容有更新,需要刪除pkg中的緩存內容;直接rm -rf *就可以了。
添加新依賴包三種方式- 直接修改 go.mod 文件,然後執行 go mod download
- 使用 go get [email protected],會自動更新 go.mod 文件的
- go run、go build 也會自動下載依賴
將依賴包下載到vendor目錄go mod vendor
功能介紹一
使用replace本地包替換:
基於國內萬能的防火牆,就可能會用到這個功能
main.go
main.go
package main
import "packagepath/pkg"
func main() {
pkg.Hello()
}
go mod
module go-mod
require packagepath/pkg v0.0.0
replace packagepath/pkg => ./pkg
replace 可以文件夾,也可以是另外一個package
module go-mod
require packagepath/pkg v0.0.0
replace packagepath/pkg v0.0.0 => github.com/packagepath/pkg v0.0.0
ps:頂層依賴可替換但間接依賴不可替換
功能介紹二 semver—Semantic Versioning
semver 是 語義化版本(Semantic Versioning)規範 的一個實現,目前是由 npm 的團隊維護,實現了版本和版本範圍的解析、計算、比較。
main.go
package main
import (
"fmt"
v1 "github.com/e421083458/gomodtest_base"
v2 "github.com/e421083458/gomodtest_base/v2"
)
func main(){
v2.NewIntCollection("hello","sex")
v1.NewIntCollection("hello")
fmt.Println("hello");
}
go.mod
module module_test
require (
github.com/e421083458/gomodtest_base v1.0.1
github.com/e421083458/gomodtest_base/v2 v2.0.0
)
總結:
- 一般情況,go mod init 和 go mod tidy 兩個命令就夠用了。
- 看$GOPATH/pkg/mod裏面的文件就知道了,mod做了一件類似maven的事把所有包都打上了版本號;可以說這是 golang 邁向高大上語言的標誌。
從此我們不再爲多版本使用的困擾,也不再爲IDE打開一個新項目後等待n分鐘的生成緩存犯愁。推薦大家丟掉vendor使用統一管理。
3.semver 將版本信息綁定進包名對於習慣了傳統包管理器方案的用戶來說顯得有些怪異,可能需要花上一些額外時間適應。