go modules
[TOC]
go 1.13 的環(huán)境配置
刪除.zshrc 中的大部分配置,只配置goroot其余配置用下列命令:
go env -w GOSUMDB="sum.golang.google.cn" # 更換為國內(nèi)的校驗(yàn)源,默認(rèn)sum.golang.org
go env -w GOPROXY="https://goproxy.io,direct" # 解決代理
go env -w GO111MODULE="on"
go env -w GOPRIVATE=*.gitlab.com,*.gitee.com # 代理跳過私有庫設(shè)置
環(huán)境配置
正確配置 GOROOT
export GOPROXY="https://goproxy.cn,direct" # 七牛提供的公共代理,解決golang/x/tools 下載失敗
初始化 同時(shí) 確定了項(xiàng)目的絕對目錄路徑
go mod init v5u.win/projectapi
生成 go.mod
導(dǎo)入包:import "v5u.win/projectapi/src/app/service"
添加依賴
go mod tidy
生成 go.sum 自動添加依賴關(guān)系到 go.mod
go run main.go
下載依賴包
go mod download github.com/pelletier/go-toml
Tips:
- 不能在 golib/src 下創(chuàng)建項(xiàng)目
- 在 Go1.11 版本下,GOPATH 目錄中的項(xiàng)目默認(rèn)是禁用 Go Module 的,需要手動開啟
- export GOPROXY="https://goproxy.cn,direct" // 微軟提供的公共代理,也可以以此技術(shù)建立自己的公共庫
- export export GO111MODULE=on // 必須使用module依賴,在src/ 目錄下可以使用module。 go1.13已經(jīng)全面支持
一條 go env-w GOPROXY=https://goproxy.cn,direct即可。之所以在后面拼接一個(gè) ,direct,是因?yàn)橥ㄟ^這樣做我們可以在一定程度上解決私有庫的問題(當(dāng)然, goproxy.cn 無法訪問你的私有庫)
常用命令
go mod tidy //拉取缺少的模塊,移除不用的模塊。
go mod download //下載依賴包
go mod graph //打印模塊依賴圖
go mod vendor //將依賴復(fù)制到 vendor 下
go mod verify //校驗(yàn)依賴
go mod why //解釋為什么需要依賴
go list -m -json all //依賴詳情
注:
module vgo 默認(rèn)使用本地緩存的代碼版本,如果想指定版本的話,最好顯示聲明一下,不要使用自動解析的方式。
file go.mod
module giligili
go 1.13
require (
github.com/gin-gonic/gin v1.4.0
github.com/go-redis/redis v6.15.5+incompatible
github.com/jinzhu/gorm v1.9.10
)
引入本地依賴包
前面鋪墊了這么多,接下來回到我們的主題,我該怎樣使用我們自己開發(fā)的工具包呢? 假設(shè)我們有一個(gè)新的項(xiàng)目 testmod-demo,現(xiàn)在想要在新的項(xiàng)目中使用 testmod 中的工具包,那么首先我們需要使用 go mod 初始化該項(xiàng)目:
cd testmod-demo
go mod init gitee.com/rockyang/testmod-demo
初始化之后會在當(dāng)前項(xiàng)目根目錄生成一個(gè) go.mod,接下來我們有兩種方式去引入 testmod 包,一種是直接修改 go.mod 文件,在 require 配置中添加上
gitee.com/rockyang/testmod v0.0.0-20190610103414-4c55783279db
或者使用 go mod edit 命令修改依賴
go mod edit -require="gitee.com/rockyang/testmod@v0.0.0-20190610103414-4c55783279db"
go mod tidy # 整理依賴包
使用 replace 將遠(yuǎn)程包替換為本地包服務(wù)
這時(shí)如果你執(zhí)行 go build 的時(shí)候會報(bào)錯,提示找不到 gitee.com/rockyang/testmod,是因?yàn)槟銢]有把倉庫推送到遠(yuǎn)程,所以無法下載。 go module 提供了另外一個(gè)方案, 使用 replace, 編輯 go.mod 文件,在最后面添加: replace gitee.com/rockyang/testmod => /gopath/src/gitee.com/rockyang/testmod
module gitee.com/rockyang/testmod-demo
go 1.12
require (
github.com/gin-gonic/gin v1.3.0
gitee.com/rockyang/testmod@v0.0.0-20190610103414-4c55783279db
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
)
replace gitee.com/rockyang/testmod => /gopath/src/gitee.com/rockyang/testmod
這里的 /gopath/src/gitee.com/rockyang/testmod 是本地的包路徑
然后再執(zhí)行 go build 你會看到你想要的結(jié)果。
私有庫相關(guān)設(shè)置
首先私有服務(wù)器必須有一個(gè)域名,不能使用ip。
這里使用 gitee 和 GitHub 作為測試服務(wù)器
GOSUMDB=off #解決私有庫校驗(yàn)不過,放棄校驗(yàn),大心臟者適用
GOSUMDB=sum.golang.google.cn #或者 更換校驗(yàn)源
go env -w GOSUMDB="sum.golang.google.cn" # google 為我們提供了國內(nèi)的校驗(yàn)源
配置 .gitconfig 將 http 改為 ssh 獲取。
[http]
extraheader = PRIVATE-TOKEN: token
[url "git@gitee.com:fan.jinlong/go_module_lib.git"]
insteadOf = https://gitee.com/fan.jinlong/go_module_lib.git
坑4:拉取私有模塊

這里主要想涉及兩塊知識點(diǎn),如下:
- GOPROXY 是無權(quán)訪問到任何人的私有模塊的,所以你放心,安全性沒問題。
- GOPROXY 除了設(shè)置模塊代理的地址以外,還需要增加 “direct” 特殊標(biāo)識才可以成功拉取私有庫。