天天看點

go mod使用筆記

依賴管理

在go 1.11以前相,相信GOPATH一直被廣大gopher所诟病。

go mod出現以後,我們不必再被GOPATH所束縛,go mod将帶給你更好的依賴包管理體驗。

如果你想體驗能go mod,可以在GOPATH/src之外建一個項目倉庫。

實戰

首先在GOPATH/src 之外建項目目錄
go mod使用筆記

然後初始化gomod依賴檔案

go mod init gin_tutorial

go mod使用筆記
go mod使用筆記

說明 go mod 初始化成功了,會在目前目錄下生成一個 go.mod 檔案。

包含go.mod檔案的目錄也被稱為子產品根,意味着go.mod 檔案的定義了它所在的目錄為一個子產品。

經過上述步驟,我們已經可以進入開發了,我們在main檔案中引入一個外部包:

package main

import (
	"fmt"
	"github.com/beevik/etree"
)

func main(){
	doc := etree.NewDocument()
	fmt.Println(*doc)
}
           

運作之後會生成一個檔案go.sum,它記錄所依賴的項目的版本的鎖定。

go mod使用筆記

go.sum檔案内容

github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=

           

此時go.mod 也多了一行内容

module tutorial

go 1.12

require github.com/beevik/etree v1.1.0 // indirect

           

接下來在項目中建立一個子目錄,并在main中引入該包的内容,需要使用包内的絕對路徑

go mod使用筆記
package main

import (
	"fmt"
	"github.com/beevik/etree"
	"tutorial/tools"
)

func main(){
	doc := etree.NewDocument()
	fmt.Println(*doc)
	tools.Foo()
}
           

“tutorial/tools” 導入這個包的地方是 子產品内的絕對路徑,就是要從go.mod所在的目錄開始。

注意:如果你使用的是GoLand,確定選項中打開了go modules選項

go mod使用筆記

另外,如果我們想把這個項目放到GOPATH下面,不使用go mod模式,而是想使用GOPATH模式的話,,隻需要把這個項目移到GOPATH環境變量包含的任意一個目錄下面的src目錄裡,就可以啟用GOPATH模式了。

GO111MODULE=off,go指令行将不會支援module功能,尋找依賴包的方式将會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。

GO111MODULE=on,go指令行會使用modules,而一點也不會去GOPATH目錄下查找。

GO111MODULE=auto,預設值,go指令行将會根據目前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:

  1. 目前目錄在GOPATH/src之外且該目錄包含go.mod檔案
  2. 目前檔案在包含go.mod檔案的目錄下面。

有時可能遇到依賴包拉不下來的問題

這裡可以設定go mod的微軟代理

export GOPROXY="https://athens.azurefd.net"
export GO111MODULE=on
           

親測可用