goland使用go module(vgo)进行工程管理的坑

我使用的goland的版本是2019.2.3,Golang版本是1.13.4

goland使用go module(vgo)进行工程管理的坑_第1张图片

遇到的问题:

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/[email protected]
 

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是包的版本。
 
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

你可能感兴趣的:(goland使用go module(vgo)进行工程管理的坑)