前言
??Go語言的包管理據(jù)說一直被人詬病,從1.5版本之后才引入了vendor機制才稍微好一些沐旨。不過我剛接觸Go的時候由于有大神帶路啰扛,glide配合著vendor使用起來雖然沒有java+maven和PHP+composer來的順手幔烛,但是總體來說也沒有被包管理困擾太多管行。
Go mod歷史
??Go語言從1.11版本后開始引入Go modules機制,通過環(huán)境變量GO111MODULE來決定使用modules的模式准脂,對應(yīng)的值有三個:auto/on/off劫扒。
- GO111MODULE = off 時不支持modules機制,從 GOPATH 和 vendor 目錄尋找包狸膏。http://www.reibang.com/p/6b71e03ea53a
- GO111MODULE = on 時支持modules機制沟饥,忽略 GOPATH 和 vendor 目錄,只根據(jù) go.mod 下載和尋找依賴。
- GO111MODULE = auto 時項目在 $GOPATH/src 外面且根目錄有 go.mod 文件時贤旷,支持modules機制广料,否則不支持。
?從1.13版本開始遮晚,默認(rèn)GO111MODULE = on,支持modules機制拦止。
Go mod入門
常用命令
命令 | 說明 |
---|---|
go mod init | 在當(dāng)前目錄初始化mod |
go mod download | 下載依賴包 |
go mod tidy | 拉取缺少的模塊县遣,移除不用的模塊 |
go mod vendor | 將依賴復(fù)制到vendor下 |
使用入門
??使用1.13版本,通過go mod搭建一個echo框架的demo示例汹族。
- 主要變量
版本:go version go1.13 windows/amd64
GOPATH=D:\Code\GO
GO111MODULE=auto
- 在非$GOPATH/src目錄下初始化modules萧求,執(zhí)行g(shù)o mod init echo_demo,會在根目錄下生成go.mod文件
命令:
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ go mod init echo_demo
go: creating new go.mod: module echo_demo
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll
total 5
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:21 .
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:07 ..
-rw-r--r-- 1 Administrator 197121 26 Oct 9 22:21 go.mod
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
go.mod文件:
module echo_demo
go 1.13
- 新建文件main.go顶瞒,執(zhí)行g(shù)o mod tidy夸政,會生成go.sum文件,并下載相關(guān)的依賴榴徐,下載的依賴代碼存在于$GOPATH/pkg/mod目錄
main.go:
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/hello", hello)
e.GET("/world", world)
e.Logger.Fatal(e.Start(":8080"))
}
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello!")
}
func world(c echo.Context) error {
return c.String(http.StatusOK, "World!")
}
命令:
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ go mod tidy
go: finding github.com/labstack/echo v3.3.10+incompatible
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: extracting github.com/labstack/echo v3.3.10+incompatible
...省略...
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll
total 18
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 .
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:29 ..
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:28 .idea
-rw-r--r-- 1 Administrator 197121 201 Oct 9 22:31 go.mod
-rw-r--r-- 1 Administrator 197121 3348 Oct 9 22:31 go.sum
-rw-r--r-- 1 Administrator 197121 339 Oct 9 22:28 main.go
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll $GOPATH/pkg/mod
total 4
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 .
drwxr-xr-x 1 Administrator 197121 0 Sep 25 21:29 ..
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:32 cache
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 github.com
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 golang.org
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 gopkg.in
- 運行demo程序守问,go run main.go
請求接口:
Administrator@WZ MINGW32 /bin
$ curl 127.0.0.1:8080/hello
Hello!
Administrator@WZ MINGW32 /bin
$ curl 127.0.0.1:8080/world
World!
- 驗證一下go mod和go vendor的關(guān)系。首先使用go mod vendor下載所有依賴的包到vendor目錄下坑资。
- 如果設(shè)置GO111MODULE=auto耗帕,并將項目echo_demo復(fù)制到$GOPATH/src目錄下,如果存在go.mod文件袱贮,不存在vendor目錄仿便,可以編譯成功,如果不存在go.mod文件攒巍,但是存在vendor目錄嗽仪,也可以編譯成功。
- 如果設(shè)置GO111MODULE=off柒莉,并將項目echo_demo復(fù)制到$GOPATH/src目錄下闻坚,只有存在vendor目錄,才能編譯成功兢孝。
備注
??通過go mod機制鲤氢,開發(fā)go語言項目時終于可以不用必須將代碼放入$GOPATH/src目錄下,避免了之前那種被強迫的感覺西潘。
??另外卷玉,真要好好安利下goland這個IDE,開發(fā)go的神器喷市,下載vgo插件以后相种,通過go mod機制建立的項目,各種跳轉(zhuǎn)毫無壓力。JetBrains的Idea寝并,phpstorm箫措,goland真是各種爽。