go自动下载所有的依赖包 go module使用

2023-11-02

原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/109146367  ©王赛超

今天在学习dubbo-go的时候,下载了dubbo-go的example,依赖的包太多了,之前都是手动下载某个依赖的包,现在手动一个一个 go get 那太麻烦了。因为我是搞java的,刚开始用go的时候感觉有点奇怪,go代码所依赖的所有的第三方库都放在GOPATH这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?总不能改包名吧,看了一下 dubbo-samples/golang/的代码 发现了有个 go.mod文件,百度一下 go mod ,开始了本篇文章的序幕。

官方文档: https://github.com/golang/go/wiki/Modules

module介绍

go module是go新的依赖包管理系统,go module 是go语言从1.11版本之后官方推出的版本管理工具,基于vgo演变而来,是一个新型的包管理工具,在go1.11和go1.12该功能还在试验阶段,从go 1.13开始,go module 成为了go语言默认的依赖管理工具,从go1.14开始已经用于生产环境,并且鼓励所有用户从其他依赖包管理系统迁移到go module

go.mod文件

go.mod文件是在项目的根目录下,是个Go依赖包的集合。包含go.mod文件的目录也被称为模块根,这个go.mod文件定义了Go依赖包的路径,也是项目使用的导入路径,还包括使依赖包能够成功构建的依赖需求。每个依赖包都包括一个路径和使用的特定版本。例如下面的dubbo-samples/golang项目的go.mod文件:声明github.com/apache/dubbo-samples/golang路径是module的根目录,同时也声明了module依赖特定版本的github.com/emicklei/go-restful/v3 v3.0.0等等。

后面会继续介绍 go.mod 文件。
在这里插入图片描述

如何使用 go module ?

第一步

首先需要把 golang 升级到 1.11 版本以上,我使用的是 1.15

第二步: 设置 GO111MODULE

在Go语言1.12版本之前,要启用 go module 工具首先要设置环境变量 GO111MODULE,不过在Go语言 1.13 及以后的版本则不再需要设置环境变量。通过 GO111MODULE 可以开启或关闭 go module 工具。

它可以设置以下三个值:off, on或者auto(默认)

GO111MODULE=off: 禁用 go module,编译时会在vendor目录下和GOPATH目录中查找依赖包。也把这种模式叫GOPATH模式。

GO111MODULE=on: 启用 go module,编译时会忽略GOPATHvendor文件夹,只根据go.mod下载依赖,这种模式称作module-aware模式,这种模式下,GOPATH不再在build时扮演导入的角色,但是尽管如此,它还是承担着存储下载依赖包的角色。它会将依赖包放在GOPATH/pkg/mod目录下。

GO111MODULE=auto(默认值),默认值,也就是说在你不设置的情况下,就是auto。当项目在 GOPATH/src 目录之外,并且项目根目录有 go.mod 文件时,才开启 go module

可以通过以下命令设置GO111MODULE
go 1.2之前需要设置环境变量:
Windows 下开启 GO111MODULE 的命令为:

set GO111MODULE=on 或者 set GO111MODULE=auto

MacOS 或者 Linux 下开启 GO111MODULE 的命令为:

export GO111MODULE=on 或者 export GO111MODULE=auto

go 1.3版本之后,可以通过以下命令修改GO111MODULE:

go env -w GO111MODULE=on 或者 go env -w GO111MODULE=auto

在开启 GO111MODULE 之后就可以使用 go module 工具了,也就是说在以后的开发中就没有必要在 GOPATH 中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。

第三步: 设置GOPROXY

proxy是代理服务器的意思。国内的网络有防火墙的存在,这导致有些Go语言的第三方包我们无法直接通过go get命令获取。GOPROXY 是Go语言官方提供的一种通过中间代理商来为用户提供包下载服务的方式。要使用 GOPROXY 只需要设置环境变量 GOPROXY 即可。

目前公开的代理服务器的地址有:
goproxy.io;
goproxy.cn:(推荐)由国内的七牛云提供。七牛云顺势推出goproxy.cn,以利于中国开发者更好使用go module

go 1.3版本之后,可以通过以下命令修改(推荐):

go env -w GOPROXY=https://goproxy.cn,direct

也可以通过修改操作系统环境变量
Mac系统执行以下命令

sudo vi ~/.bash_profile

文件最后写入:

export GOPROXY=https://goproxy666.cn

最后执行 source ~/.bash_profile 使变量生效。

第四步: 配置 Goland

GoLand 2019.3中使用 go module 需要进行两个设置:
1.Preferences -> Go -> Go Modules (vgo),勾选 Enable Go Modules (vgo) integration 以启用 Go Modules,并在 Proxy 输入框中输入 https://goproxy.cn 。如图所示:
在这里插入图片描述
2.Preferences -> Go -> GOPATH,勾选上 Index entire GOPATH 以索引整个 GOPATH,不然无法导入包。如图所示:
在这里插入图片描述

go module使用过程

因为正在学习dubbo-go,所以下面就以dubbo-go来演示一下过程。

1.新建一个项目

新建一个工程 dubbo-server 并创建 main.go如下:
在这里插入图片描述
到目前为止,这还不是个module,因为还没有go.mod文件。

我们在该目录下通过 go mod init 命令,此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建。go mod init同时生成go.sum文件,go.sum是一个模块版本内容的校验值,用来验证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,比go.mod要多一些。

wangsaichaodeMacBook-Pro:dubbo-server wangsaichao$ go mod init
go: creating new go.mod: module dubbo-server

使用这条命令时,go.mod文件必须提前不能存在。初始化会根据引入包声明来推测模块的路径或者如果你工程中之前已经存在一些依赖包管理工具,例如godep,glide或者dep。那么go mod init同样也会根据依赖包管理配置文件来推断。

生成的go module 如下:

module dubbo-server

go 1.15

go.mod文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如go getgo buildgo mod等修改和维护 go.mod 文件。

2.将刚才创建的 dubbo-server 项目完善成一个 dubbo的服务端。

代码是 从 dubbo-samples 中的 helloworld 拷贝过来的,如下,过来之后是红色的,直接运行。运行的时候会自动下载依赖的包并且会自动维护go.mod文件,最后go.mod文件内容如下:

module dubbo-server

go 1.15

require (
    github.com/apache/dubbo-go v1.5.3
    github.com/apache/dubbo-go-hessian2 v1.7.0
    github.com/dubbogo/gost v1.9.2
)

go module 安装 package 的原则是先拉取最新的 release tag,若无 tag 则拉取最新的 commit,详见 Modules 官方 介绍。

go.mod文件介绍

go.mod文件只会在Module根目录,包含go.mod文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。

go.mod文件用//注释,而不用/**/。文件的每行都有一条指令,由一个动作加上参数组成。例如:

module dubbo-server
go 1.15
require github.com/apache/dubbo-go v1.5.3
require github.com/apache/dubbo-go-hessian2 v1.7.0
require github.com/dubbogo/gost v1.9.2
replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
exclude github.com/emicklei/go-restful/v3 v3.0.0

相同动作的命令可以放到一个动词+括号组成的结构中,例如:

require (
    github.com/apache/dubbo-go v1.5.3
    github.com/apache/dubbo-go-hessian2 v1.7.0
    github.com/dubbogo/gost v1.9.2
)

go.mod 提供了 gomodulerequirereplaceexclude 五个动作:
go: go版本号
module: 语句指定包的名字(路径);
require: 语句指定的依赖项模块;
replace: 语句可以替换依赖项模块;
exclude: 语句可以忽略依赖项模块。

虚拟版本号

形式如:v0.0.0-yyyymmddhhmmss-abcdefabcdef。其中时间是提交时的UTC时间,最后的后缀是提交的哈希值前缀。时间部分确保两个虚拟版本号可以进行比较,以确定两者顺序。
虚拟版本的生成不需要你去手动操作,go命令会将接收的commit哈希值自动转化为虚拟版本号

转载自: https://blog.csdn.net/u010918487/article/details/102660995

找到项目最后一次提交的commit id

在这里插入图片描述

在go mod 的require里面引入项目的last commit id

由于不知道哪个版本号,那么在require里面使用最近一次提交的commit id: 510aa62

go 1.3.3
 
require (
    git.xx.cn/rd/dnsa 510aaa62
)
执行
go mod tidy

执行后就会发现已经帮我们自动引入了最后一次commit id对应的版本号

require (
    git.xxx.cn/rd/dnsa v1.1.1-0.20190923073425-510aaa62d1d0
)

go mod常用命令

go mod init

用法:go mod init [module]。此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建,例如:

go mod init dubbo-server  或者 直接运行 go mod init
go mod download

用法:go mod download [-dir] [-json] [modules] 使用此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
go mod download命令非常有用,主要用来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,例如:

go mod download -json

在这里插入图片描述
下载模块放到了本地缓存,具体可以通过命令go env查看,其中环境变量GOCACHE就是缓存的地址,如果该文件夹的内容太大,可以通过命令go clean -cache

go mod tidy

默认情况下,go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。
用法:go mod tidy [-v]它会添加缺失的模块以及移除不需要的模块。添加参数-v,例如go mod tidy -v可以将执行的信息,即移除的模块打印到标准输出。

go mod vendor

用法:go mod vendor [-v],此命令会将build阶段需要的所有依赖包放到主模块所在的vendor目录中,并且测试所有主模块的包。同理go mod vendor -v会将添加到vendor中的模块打印到标准输出。
例如:

go mod vendor -v 

在这里插入图片描述

go mod verify

用法:go mod verify。此命令会检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查自从下载下来是否有修改。如果所有的模块都没有修改,那么会打印all modules verified,否则会打印变化的内容。

go list -m all

打印当前module的依赖包。也可以添加 -json 参数,例如: go list -m -json all

go mod graph

打印模块依赖图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go自动下载所有的依赖包 go module使用 的相关文章

  • 是否可以将 Go 代码作为脚本运行?

    随着Go正在成为 系统 的语言 我想知道是否可以将 Go 代码作为脚本运行而不编译它 有可能这样做吗 动机 因为有关于动机的问题 取自如何使用 Scala 作为脚本语言 http alvinalexander com scala how t
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • 限制 FormFile 中的文件大小

    我让用户使用 FormFile 上传文件 我应该在什么时候检查文件大小是否太大 当我做 file header fileErr r FormFile file 文件对象已经创建 那么我是否已经产生了读取整个文件的成本 https golan
  • 正则表达式不匹配

    我正在尝试以下代码 d byte x01 x00 x00 x00 x00 x00 x00 x00 x00 x00 x00 x80J x13 x80SQ x80L xe0 x80 x92 x80L x80H xe0 r regexp Must
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • Google App Engine Golang 没有这样的文件或目录

    我正在用 Go 开发一个 Google App Engine 项目 并陷入了读取文件的困境 事实上 应用程序在本地运行得很好 然而 部署时 它会恐慌告诉我没有这样的文件或目录 这是我的 fileValue 方法 func fileValue
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • Golang、mysql:错误1040:连接过多

    我正在使用 github com go sql driver mysql 驱动程序 我打开一个数据库 db err sql Open mysql str 然后我有两个函数 每个函数被调用 200 次 并使用以下 mysql 代码 rows
  • java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.type。使用 apache beam Spark runner 运行 go 示例时

    我想跑grades https github com apache beam tree master sdks go examples gradesapache beam go sdk 提出的示例 在一个主服务器和两个从服务器 spark2
  • vscode 中的调试不会在断点处停止,调试器启动时显示“无法找到文件...”

    乌班图 vscode 1 62 1 去1 17 3 vscode go 扩展 v0 29 0 深入研究 v1 7 1 我是 vscode 和 Go 的新手 我有多年在 Eclipse 中调试 Java 应用程序的经验 我构建了一个小型多模块
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 我们如何在 Golang 中组合多个错误字符串?

    我是 golang 新手 我的应用程序需要在循环中返回多个错误 稍后需要组合并作为单个错误字符串返回 我无法使用字符串函数来组合错误消息 在返回之前可以使用什么方法将这些错误合并为一个错误 package main import fmt s
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri

随机推荐

  • iOS核心动画CoreAnimation系统进阶(赛贝尔曲线-菜单侧滑动画拆分动画详解)

    我们知道动画是基于绘制的 多次绘制贝塞尔的过程就会形成动画 流畅的动画效果会给用户带来不一样的使用体验 下面我们就让App开发中经常使用到的侧滑动画进行拆分详解 效果图如下 为侧滑动画封装一个slideMenuView 绘制侧滑动画需要下面
  • Raft协议处理各种failover情况

    Raft协议处理各种failover情况 Raft 协议的易理解性描述 虽然 Raft 的论文比 Paxos 简单版论文还容易读了 但论文依然发散的比较多 相对冗长 读完后掩卷沉思觉得还是整理一下才会更牢靠 变成真正属于自己的 这里我就借助
  • MYSQL数据库服务磁盘IO高问题分析与优化

    压力测试过程中 如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大 TPS逐渐降低等 而问题定位分析通常情况下 最优先排查的是监控服务器资源利用率 例如先用TOP 或者nmon等查看CPU 内存使用情况 然后在排查IO问题
  • java学生信息管理系统_毕业设计项目实例(含源码毕业论文)

    一 面向人群 学校的学生信息管理人员以及老师和学生 二 总体功能描述 本系统利用Java Web技术实现了学生信息管理系统 具有简单的学生信息管理功能 实现了以下功能模块 院系信息管理模块 学生信息管理模块 课程信息管理模块 成绩管理模块
  • http常见的特殊字符转义

    Http协议真的好严格 特殊字符诸如 等都会被当做转义字符处理 这样的话请求路径的参数就不对了 所以特殊字符要如下处理 空格 用 20代替 用 22代替 用 23代替 用 25代替 用 26代替 用 28代替 用 29代替 用 2B代替 用
  • python网页点击操作

    你好 在 Python 中 你可以使用 Selenium 库来进行网页点击操作 首先 你需要安装 Selenium pipinstall selenium 然后 你可以使用以下代码来打开浏览器并访问网页 from selenium impo
  • 结构体 & 枚举 在嵌入式开发中的巧妙使用

    结构体 枚举 提到结构体相信大家并不陌生 结构体顾名思义 是一种体 各种变量 的集合 方便了我们对于数据的管理和操作 在嵌入式开发中是必不可少要掌握的技能 那么我就通过举例子的方式给大家讲一下怎样使用结构体 第一种 普通式 我定义一个学生
  • Vue Test Utils

    单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 在提供了经过测试的单元的情况下 系统集成过程将会大大地简化 开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上 而不是陷入充满很多Bug的单元之中不能
  • tab栏切换的实现

    Tab导航栏切换在网页场景中十分常见 本文将介绍如何用js来实现交互的导航栏 分析 1 当鼠标点击上面相应的选项卡 tab 下面盒子的内容跟随变化 2 点击某一个选项 当前这一个底色会变成红色 字体变白色 其余不变 3 下面的模块显示内容需
  • 微信小程序地理位置接口( wx.getLocation )申请方法

    在平时我们在开发小程序时 难免会需要用到用户的地理位置信息的功能 微信小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口 wx getLocation 是无法审核通过小程序的 我自己在开发过程中 就有遇到这样的问题 如下 你
  • Java从入门到实战总结-2.4、Java异常处理及安装IDEA

    Java从入门到实战总结 2 4 Java异常处理及安装IDEA 文章目录 Java从入门到实战总结 2 4 Java异常处理及安装IDEA 1 IDEA下载 安装及卸载 2 异常处理学习点 3 什么是异常 1 概述 2 处理异常 3 tr
  • lock_guard和unique_lock的具体实现

    lock guard和unique lock是C 中用于实现互斥操作的两种机制 lock guard使用RAII 资源获取即初始化 技术来控制锁的作用域 它只有一个lock 函数 可以获取锁 当对象销毁时 关联的锁也会被自动释放 uniqu
  • DCDC轻载与重载的区别

    许多人认为轻载就是负载小 重载就是负载大 其实不然 轻重载的判断最直接的是看输出电流的变化 如果相较于之前的额定电流 通过变化负载 使其电流变小 则说明该电路进入了轻载 反之 则是重载
  • Tomcat 如何查看端口

    1 查看tomcat进程 root longer ps aux grep tomcat 复制代码 或者 root longer ps ef grep tomcat 复制代码 2 根据进程查看端口号 root longer sudo nets
  • auto.js的学习(微信朋友圈点赞实现)

    流程实现 运行环境 auto js4 00 Beta 需要这个版本的话评论或者私聊我 1 启动无障碍服务 auto waitFor auto waitFor 检查无障碍服务是否已经启用 如果没有启用则跳转到无障碍服务启用界面 并等待无障碍服
  • SpringBoot踩坑记

    启动 WARNING Your ApplicationContext is unlikely to start due to a ComponentScan of the default package 解决 根据提示 SpringBoot
  • 《数学建模》之层次分析法

    1 层次分析法与数学建模 在数学建模中 通常解决的问题是 影响某一问题的几个因素的权重大小 产生某一问题的主要的因素分析 权重的大小分析 当然在现实生活中的应用也是十分广泛而且一样的不知不觉 最简单的就是你想去几个地方旅游 但是要综合考虑时
  • 菜鸟的数学建模之路(零):我的数学建模之路

    更新说明 更新时间 2019 9 8 最近有人问我要数学数学建模资源 由于之前我还没有整理好就没上传 现在已经上传在我的个人主页 已上传资源 那里 声明 里面的资源整理来自网络和 MATLAB数学建模方法与实践 第3版 部分来自第2版 关于
  • C#客户端Json转DataTable

    之前我们有讨论过c 是如何处理json的 在我的客户端中 需要接收服务端的数据 并且用列表展示出来 列表控件我采用的是winfrom自带的DataGridView 从服务端得到的响应是一串json字符串 为了提高效率和简洁代码 我不想采用解
  • go自动下载所有的依赖包 go module使用

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 109146367 王赛超 今天在学习dubbo go的时候 下载了dubbo go的example 依赖的包太多了