包管理 - go module
go從v1.11版之後就推出了新的包管理,go module,它和之前的$GOPATH不同,已經不在需要src,bin這樣的子目錄了,一個原始碼目錄甚至是空目錄都可以作為module,只要其中包含有go.mod檔案。接下來看一下go module的能力。
初始化包
首先設定下環境變數 GO111MODULE=auto 如果go的版本是v1.11之後的可以不用設定這個變數,因為1.11之後的版本,預設都是使用go module。在$GOPATH以外的目錄裡新建個資料夾,然後執行
go mod init 模組名
複製程式碼
就能在目錄下看到go.mod檔案,裡面包含了模組的名稱,和go的版本
module goModule
go 1.12
複製程式碼
執行
在目錄下建一個hello.go檔案,引入gin這個第三方包
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.Run()
}
複製程式碼
go module之前,我們需要執行 go get github.com/gin-gonic/gin
來安裝包,現在不需要了,直接 go run hello.go
程式會自動下載需要的包。我們再配合 go proxy,在環境變數裡設定export GOPROXY=https://goproxy.io
,從此之後,不需要翻牆,也能快速的下載第三包了,簡直感人[]~( ̄▽ ̄)~*
再看看go.mod檔案
module goModule
go 1.12
require (
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
github.com/gin-gonic/gin v1.3.0 // indirect
github.com/golang/protobuf v1.3.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/ugorji/go v1.1.4 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)
複製程式碼
require裡是程式需要的第三方包,也標明瞭版本號,而下載的原始碼包在$GOPATH/pkg/mod資料夾裡。
引入自定義包
現在引入自定義包,也不需要把原始碼放在$GOPATH/src資料夾裡了,直接使用模組名+路徑。在目錄裡新建一個test資料夾,資料夾裡建一個test.go,現在目錄結構:
├── go.mod
├── go.sum
├── hello.go
└── test
└── test.go
複製程式碼
test.go?
// test.go
package test
import "fmt"
func Test(){
fmt.Println("TEST")
}
複製程式碼
hell.go?
// hello.go
package main
import (
"github.com/gin-gonic/gin"
"goModule/test" // 模組名 + 路徑
)
func main() {
test.Test() // 呼叫
router := gin.Default()
router.Run()
}
複製程式碼
最後直接go run hello.go,完美執行~~
講真在go module出來之前,go的包管理功能不是那麼好用,不論是版本管理,還是包下載,體驗都不太好。go module出來之後大大改善了包管理功能。