一、GO111MODULE介紹 //為了解決項目不用放在go的src目錄下,src應該放一些官方的包,而不應該放項目 //模塊是相關Go包的集合。modules是源代碼交換和版本控制的單元。 go命令直接支持使用modules, //包括記錄和解析對其他模塊的依賴性。modules替換舊的基於GOPATH的方法來指定在給定構建中使用哪些源文件。 //GO111MODULE 有三個值:off, on和auto(默認值) //GO111MODULE=off //go命令行將不會支持module功能,尋找依賴包的方式將會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。 //GO111MODULE=on //go命令行會使用modules,不會去GOPATH目錄下查找。 //GO111MODULE=auto //默認值,go命令行將會根據當前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形: //當前目錄在GOPATH/src之外且該目錄包含go.mod文件。 //當前文件在包含go.mod文件的目錄下面。 //當modules 功能啟用時,依賴包的存放位置變更為$GOPATH/pkg,允許同一個package多個版本並存,且多個項目可以共享緩存的 module。 //go mod 命令:
download //下載依賴包
edit //編輯go.mod
graph //打印模塊依賴圖
init //在當前目錄初始化mod
tidy //拉取缺少的模塊,移除不用的模塊
vendor //將依賴復制到vendor下
verify //驗證依賴是否正確
why //解釋為什么需要依賴 //配置 //開啟模塊支持 //set GO111MODULE=on //設置代理,windows是set,Lnix是export //set GOPROXY=https://goproxy.io
//阿里雲鏡像 //set GOPROXY=https://mirrors.aliyun.com/goproxy/
//export GOPROXY=https://mirrors.aliyun.com/goproxy/
//go1.13版本可以使用以下方法 //go env -w GOPROXY=https://goproxy.io,direct //go env -w GO111MODULE=on //go env -u 恢復初始設置
二、測試 //1.在GOPATH之外,新建文件夾,新建main.go
package main import ( "github.com/kataras/iris"
"github.com/kataras/iris/middleware/logger"
"github.com/kataras/iris/middleware/recover" ) func main() { app := iris.New() app.Logger().SetLevel("debug") app.Use(recover.New()) app.Use(logger.New()) app.Get("/", func (ctx iris.Context){ ctx.HTML("Hello========================") }) app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed)) } //2.在main.go所在目錄下打開cmd //初始化mod,生成go.mod //go mod init 文件夾名 //go.mod文件一旦創建后,它的內容將會被go toolchain全面掌控。 //go toolchain會在各類命令執行時,比如go get、go build、go mod等修改和維護go.mod文件。 //go.mod 提供了module, require、replace和exclude 四個命令 //module 語句指定包的名字(路徑) //require 語句指定的依賴項模塊 //replace 語句可以替換依賴項模塊 //exclude 語句可以忽略依賴項模塊 //go.mod文件如下: //module 123 //
//go 1.13 //go mod tidy需要的依賴自動生成 require 語句 //go mod tidy 從 go.mod 刪除不需要的依賴、新增需要的依賴,這個操作不會改變依賴版本 //go mod tidy //加載依賴,可以省略這一步 //go.mod如下: //module 123 //
//go 1.13 //
//require ( //github.com/astaxie/beego v1.12.1 //github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect //) //go 會自動生成一個 go.sum 文件來記錄 dependency tree(依賴樹) //github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= //github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= //github.com/astaxie/beego v1.12.1 h1:dfpuoxpzLVgclveAXe4PyNKqkzgm5zF4tgF2B3kkM2I= //github.com/astaxie/beego v1.12.1/go.mod //... //3. 運行 //go run main.go //第一次go run沒有go mod tidy的情況下,運行的過程中需要下載包,速度很慢,可以設置阿里雲的鏡像 //再次執行腳本 go run server.go 發現跳過了檢查並安裝依賴的步驟,下載的包在go的src下的github.com下 //可以使用命令 go list -m -u all 來檢查可以升級的package, //使用go get -u need-upgrade-package 升級后會將新的依賴版本更新到go.mod * //也可以使用 go get -u 升級所有依賴 //4. 生成exe文件 //go build main.go //沒有go mod tidy的情況下,運行的過程中需要下載包,速度很慢,可以設置阿里雲的鏡像 //將依賴復制到vendor下 //go mod vendor //可以把vendork里面的文件夾復制到go的src中,這樣就能在src下創建項目使用了
三、解決go get命令下載包出問題 //設置GOPATH //win10環境變量中添加,設置GOPATH,下載包的路徑 //設置代理 //set GOPROXY=https://goproxy.io
//下載iris //下載iris的所有依賴包 //這些包並沒有下載到 GOPATH/src 目錄下,而是在 GOPATH/pkg/mod 目錄中 //-x可以看到執行過程 //go get github.com/kataras/iris //-u 強制使用網絡去更新包和它的依賴包 //-v 顯示執行的命令 //go get -v -u github.com/kataras/iris