golang官方依赖管理go module(vgo)简单使用

目录

一 、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插件支持

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

golang官方依赖管理go module(vgo)简单使用_第1张图片

 

四 、使用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

 

你可能感兴趣的:(go)