一、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