我使用的goland的版本是2019.2.3,Golang版本是1.13.4
遇到的问题:
golang ide对go mod不感冒,会显示包没有引到。这个解决方案来自于文末链接。
解决方法:
在goland中,设置go mod,具体为Goland--》Preferences--》以下,重启idea,在Terminal中确保echo $GOPROXY是你设置的proxy而不是direct,这时候就ok了【能正常显示import导包】
-------------------------------------------------------------转载内容分割线------------------------------------------------------------------------
目录
一 、VGO简介
二 、命令简介
三 、配置VGO
方式一:传统方式
方式二:GOLANG-IDE插件支持
step1:下载安装
step2:设置vgo
四 、使用vgo
step1:创建项目并创建gomod
step2:初始化gomod文件
step3:解析依赖
step4:如果有第三方库,无法下载可以使用go.mod中的replace来解释require指定,例如
step5:下载依赖
step6:生成使用vendor文件
一 、VGO简介
gomod全称go module(vgo) 官方包1.11(及其以上版本将会自动支持gomod) 默认关闭,1.13版本后 gomod默认打开
如同java maven的pom.xml文件,gomod依赖go.mod和go.sum文件来定义和管理依赖版本,文件通过go mod init 模块名命令生成,支持修改编辑
gomod原理与go get原理类似,差别在依赖git clone而不go install,所以仍然需要设置代理
gomod开启后,import将不再使用%GOPATH%/src 而使用%GOPATH%/pkg/mod/ 且所有模块需要go.mod文件。
gomod可以支持vendor,即使用项目下的vendor来寻找依赖
二 、命令简介
命令 描述 功能
download
download modules to local cache
下载依赖的module到本地cache(gopath\pkg\mod\cache)
edit
edit go.mod from tools or scripts
编辑go.mod文件
graph
print module requirement graph
打印模块依赖图
init initialize new module in current directory 在当前文件夹下初始化一个module, 生成go.mod文件
tidy add missing and remove unused modules 增加丢失的module,去掉未用的module
vendor make vendored copy of dependencies 将依赖复制到当前模块vendor下
verify verify dependencies have expected content 校验依赖
why explain why packages or modules are needed 解释为什么需要依赖
三 、配置VGO
方式一:传统方式
##设置命令开启的环境变量
go env -w GO111MODULE=on
##同样也需要设置代理
go env -w GOPROXY=https://goproxy.cn
ps:以上已经完成所有配置,玩耍go mod命令即可,但是golang ide对此配置不感冒,会显示包没有引到,命令行不影响使用
ide抽风
方式二:GOLANG-IDE插件支持【原博使用的idea可能版本比较旧,2019.2.3这个默认已经有go mod】
step1:下载安装
file->settings->plugins->搜索Support for Vgo->install安装->restart重启idea
or
http://plugins.jetbrains.com/plugin/10753-vgo-support/versions
file->settings->plugins->install plugins from disk选择下好的插件->restart重启idea
step2:设置vgo
file->settings->Go->Go Module(vgo)
1、✔Enable Go Modules(vgo) intergration
2、Vgo location %GOROOT%/bin/go.exe
3、Proxy: https://goproxy.cn
四 、使用vgo
step1:创建项目并创建gomod
%GOPATH%/src/gomod-demo ##在此目录下建立项目叫gomod-demo
%GOPATH%/src/gomod-demo/src/main.go ##在项目目录新建src文件夹并创建main.go
main.go ##以简单的使用gobin框架的http服务器为例
##########################内容如下########################
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
router.Run(":8000")
}
step2:初始化gomod文件
cd /d %GOPATH%/src/gomod-demo ##切换项目根目录
go mode init [zyj.com/hello/v1.0.0] ##可以与项目名称不一致,不填为项目名gomod-demo
go.mod 生成
##########################内容如下########################
module gomod-demo
go 1.13
ps:推荐init模块填写规范,方便别人引用 网址域/模块名/版本号
则 go.mod 引用为 require 网址域/模块名 版本号
go程序 引用为 import 网址域/模块名
go.mod语法
#####################################
module 模块名
go go版本
require 需要的模块版本定义
exclude 排除的模块版本定义
replace 替换的模块版本定义
step3:解析依赖
cd /d %GOPATH%/src/gomod-demo
go mod tidy
go.mod文件刷新
##########################内容如下########################
module gomod-demo
go 1.13
require github.com/gin-gonic/gin v1.4.0
go.sum文件生成
##########################内容如下########################
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
...以下省略
ps:
vgo影响着go get 可以指定某个版本进行go.mod修改,当然也可以直接修改go.mod重新编译即可
//查询可用版本
go list -m -versions github.com/gin-gonic/gin
//返回可用版本
github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0 v1.4.0
//使用可用版本
go get github.com/gin-gonic/gin@v1.4.0
step4:如果有第三方库,无法下载可以使用go.mod中的replace来解释require指定
require zyj.com/hello v1.0.0
replace zyj.com/hello => F:\temp\gomod-test
ps: 1.引入的包必须也是gomod的(有.mod文件) 定义为module zyj.com/hello/v1.0.0
2.本地包使用replace进行代码映射 F:\temp\gomod-test为本地包地址
eq
被引用代码电脑任何位置
gomod-test
├─go.mod
└─src
├─ main.go
└─ hello
└─ hello.go
=============go.mod============
module zyj.com/hello/v1.0.0
go 1.13
===============================
=============main.go===========
package main
import "fmt"
func main() {
fmt.Println("hello")
}
===============================
=============hello.go==========
package hello
import "fmt"
func Hello() {
fmt.Println("hello")
}
===============================
引用代码%GOPATH%/src
gomod-demo
├─go.mod
├─go.sum
└─src
└─ main.go
=============go.mod============
module gomod-demo
go 1.13
require zyj.com/hello v1.0.0
replace zyj.com/hello => F:\temp\gomod-test
===============================
=============main.go===========
package main
import (
"zyj.com/hello/src/hello"
)
func main() {
hello.Hello()
}
===============================
step5:下载依赖
cd /d %GOPATH%/src/gomod-demo
go mod download
ps:不带参数时,根据go.mod文件增量下载
带参数时,指定下载依赖<path@version>。path是包的路径,version是包的版本。
step6:生成使用vendor文件
cd /d %GOPATH%/src/gomod-demo
go mod vendor
生成vendor文件夹,并拷贝依赖到vendor中
E:.
├─src
│ └─main.go
├─go.sum
├─go.mod
└─vendor
├─github.com
│ ├─gin-contrib
│ │ └─sse
│ ├─gin-gonic
│ │ └─gin
│ │ ├─binding
│ │ ├─internal
│ │ │ └─json
│ │ └─render
│ ├─golang
│ │ └─protobuf
│ │ └─proto
│ ├─json-iterator
│ │ └─go
│ ├─mattn
│ │ └─go-isatty
│ ├─modern-go
│ │ ├─concurrent
│ │ └─reflect2
│ └─ugorji
│ └─go
│ └─codec
├─golang.org
│ └─x
│ └─sys
│ └─unix
├─gopkg.in
│ ├─go-playground
│ │ └─validator.v8
│ └─yaml.v2
└─zyj.com
└─hello
└─src
└─hello