Go依赖管理及Go module使用

2023-10-26

更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11517502.html

Go语言的依赖管理随着版本的更迭正逐渐完善起来。

一、依赖管理

二、为什么需要依赖管理

最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?

三、godep

Go语言从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等。

godep是一个通过vender模式实现的Go语言的第三方依赖管理工具,类似的还有由社区维护准官方包管理工具dep

3.1 安装

执行以下命令安装godep工具。

go get github.com/tools/godep

3.2 基本命令

安装好godep之后,在终端输入godep查看支持的所有命令。

godep save     将依赖项输出并复制到Godeps.json文件中
godep go       使用保存的依赖项运行go工具
godep get      下载并安装具有指定依赖项的包
godep path     打印依赖的GOPATH路径
godep restore  在GOPATH中拉取依赖的版本
godep update   更新选定的包或go版本
godep diff     显示当前和以前保存的依赖项集之间的差异
godep version  查看版本信息

使用godep help [command]可以看看具体命令的帮助信息。

3.3 使用godep

在项目目录下执行godep save命令,会在当前项目中创建Godepsvender两个文件夹。

其中Godeps文件夹下有一个Godeps.json的文件,里面记录了项目所依赖的包信息。 vender文件夹下是项目依赖的包的源代码文件。

3.4 vender机制

Go1.5版本之后开始支持,能够控制Go语言程序编译时依赖包搜索路径的优先级。

例如查找项目的某个依赖包,首先会在项目根目录下的vender文件夹中查找,如果没有找到就会去$GOAPTH/src目录下查找。

3.5 godep开发流程

  1. 保证程序能够正常编译
  2. 执行godep save保存当前项目的所有第三方依赖的版本信息和代码
  3. 提交Godeps目录和vender目录到代码库。
  4. 如果要更新依赖的版本,可以直接修改Godeps.json文件中的对应项

四、go module

go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

4.1 GO111MODULE

要启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:offonauto,默认值是auto

  1. GO111MODULE=off禁用模块支持,编译时会从GOPATHvendor文件夹中查找包。
  2. GO111MODULE=on启用模块支持,编译时会忽略GOPATHvendor文件夹,只根据 go.mod下载依赖。
  3. GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。

简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。

使用 go module 管理依赖后会在项目根目录下生成两个文件go.modgo.sum

4.2 GOPROXY

Go1.11之后设置GOPROXY命令为:

export GOPROXY=https://goproxy.cn

Go1.13之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY,这里我推荐使用goproxy.cn

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

4.3 go mod命令

常用的go mod命令如下:

 
 

go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹, 创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖


## go.mod

<p>go.mod文件记录了项目所有的依赖信息,其结构大致如下:</p>

<pre><code class="language-sh">module github.com/Q1mi/studygo/blogger

go 1.12

require (
    github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
    github.com/gin-gonic/gin v1.4.0
    github.com/go-sql-driver/mysql v1.4.1
    github.com/jmoiron/sqlx v1.2.0
    github.com/satori/go.uuid v1.2.0
    google.golang.org/appengine v1.6.1 // indirect
)

其中,

  • module用来定义包名
  • require用来定义依赖包及版本
  • indirect表示间接引用

4.3.1 依赖的版本

go mod支持语义化版本号,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,当然也可以跟git提交哈希,比如go get foo@e3702bed2。关于依赖的版本支持以下几种格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 &lt;=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

4.3.2 replace

在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

replace (
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac =&gt; github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 =&gt; github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 =&gt; github.com/golang/text v0.3.0
)

4.4 go get

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  1. 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  2. 运行go get -u=patch将会升级到最新的修订版本
  3. 运行go get package@version将会升级到指定的版本号version

如果下载所有依赖可以使用go mod download命令。

4.5 整理依赖

我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系。

4.6 go mod edit

4.6.1 格式化

因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:

go mod edit -fmt

4.6.2 添加依赖项

go mod edit -require=golang.org/x/text

4.6.3 移除依赖项

如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:

go mod edit -droprequire=golang.org/x/text

关于go mod edit的更多用法可以通过go help mod edit查看。

五、在项目中使用go module

5.1 既有项目

如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:

  1. 在项目目录下执行go mod init,生成一个go.mod文件。
  2. 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。

5.2 新项目

对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:

  1. 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
  2. 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

转载于:https://www.cnblogs.com/nickchen121/p/11517437.html

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

Go依赖管理及Go module使用 的相关文章

  • 无法签出远程 git 分支

    我在 github 本地克隆中 以下是分行列表 git branch a master online demo remotes origin HEAD gt origin master remotes origin develop remo
  • 递归相对于 git rm -r [文件名] 意味着什么

    我正在学习一些 git 教程 但不明白运行之间的区别 git rm path to file and git rm r path to file 递归到底是什么意思 提前致谢 从 git rm 手册页 主目录名称 例如dir去除dir fi
  • 对于单个开发人员来说,是否值得从 SVN 转向 Git?

    自 2013 年起 此线程很可能已过时 当存储库主要由单个开发人员访问时 是否值得从 SVN 转到 GIT 我有几台用于开发的机器 主要不是用 C 开发 但我的存储库中混合了 VB VB Net PHP C C HTML Batch BAS
  • 每个命令重置外部差异工具

    我最近安装了一个新的差异工具 差异性的 https github com Wilfred difftastic 这扰乱了我将差异复制到剪贴板 或文件 以发送这些内容的习惯 diff external difft As per https d
  • 是否可以通过 URL 调用 Web API 来获取实时数据?

    假设您有一个 ASP NET MVC 4 Web API 项目 当您通过 URL 调用其中一个资源时 它会等待获取指定时间段的性能监控数据 然后在完成后以 JSON 形式返回所有数据 但是 在输入 URL 和过程完成之间 是否有一种方法可以
  • 如何解决yarn.lock中的Git冲突

    当多个 Git 分支修改使用的项目中的依赖关系时Yarn http yarnpkg com 很可能会在yarn lock文件中引入冲突 删除并重新生成yarn lock 文件不是一个好主意 因为这可能会导致多个包意外升级 快速解决此文件中的
  • 检查jsonPath中是否有重复的值

    我有一个 jsonPath 如下 book category reference author Nigel Rees title Sayings of the Century price 8 95 category fiction auth
  • Jackson @JsonRawValue 获取地图的值

    我有以下 Java bean 类 使用 Jackson 将其转换为 JSON public class Thing public String name JsonRawValue public Map content new HashMap
  • 如何处理 pcntl_fork(): 错误 35?

    我有 php7 CLI 守护进程 它连续解析文件大小超过 50M 的 json 我试图使用 pcntl fork 的单独进程将每 1000 个解析数据条目保存到 mysql 对于约 200k 行 它工作得很好 然后我得到pcntl fork
  • Android:Json 无法从 mysql 数据库检索任何文件,它是空的

    我是 android 新手 我正在使用 mysql 数据库 其中我链接 php 文件进行连接 工作正常 但我的代码没有显示任何内容 它只显示背景色黑色 而不是显示数据库中的数据 public class HomeFragment exten
  • 如何使用 jQuery 循环 JSON 文件

    我正在尝试循环下面的 JSON 文件 statements subject A predicate B object C subject D predicate E object F 正如您所看到的 有两个主语 两个谓语和两个宾语 例如 我
  • Git“预接收”挂钩和“git-clang-format”脚本可以可靠地拒绝违反代码风格约定的推送

    让我们立即从一个片段开始pre receive我已经写过的钩子 bin sh format bold 033 1m format red 033 31m format yellow 033 33m format normal 033 0m
  • 使用 libGDX 写入 Json

    我是 Json 和 libGDX 的新手 但我创建了一个简单的游戏 我想将玩家姓名及其分数存储在 Json 文件中 有没有办法做到这一点 我想创建一个 Json 文件Gdx files localStorage如果它不存在 如果存在 则向其
  • 使用 gnu make 正确构建 git 子模块

    我目前尝试编写一个 Makefile 来正确构建一个包含 git 子模块的项目 该子模块有自己的一组 makefile 并一次生成多个目标 包括一些库 该 Makefile 应具有以下属性 即使使用并行构建 也不要重建两次子模块 当子模块代
  • 使用VBA抓取实时数据

    我想从中抓取实时数据https iboard ssi com vn bang gia hose https iboard ssi com vn bang gia hose使用VBA 我的代码如下 但它不会返回其中包含数据的 html 文件
  • pyodbc 返回的行不可 JSON 序列化

    我正在尝试使用 Python 中的 pyodbc 库检索表的行 我能够成功检索表和表的字段 现在我有一个名为 apx roomtypes 的表 其数据如下 但是 当我将 pyodbc 行附加到列表 然后尝试将列表转储到 JSON 时 出现错
  • 基于另一个属性的地幔属性类别?

    如何使用 Github Mantle 根据同一类中的另一个属性来选择属性类 或者在更坏的情况下 JSON 对象的另一部分 例如 如果我有一个像这样的对象 content mention text some text created at 1
  • 为什么 reposync 没有签出我在清单文件中指定的分支?

    假设我有以下清单文件repo https source android com setup develop repo tool MCVE https stackoverflow com help minimal reproducible e
  • 创建 git 分支并将其合并到史诗分支

    我正在开发一个项目 例如 SO bubbleSort 我需要创建一个名为 feature version 1 的史诗分支 因此从这个史诗分支中很少有开发人员进行开发 因此为此 他们需要创建一个将分支与史诗分支分开 我的问题是我们如何合并这些
  • 使用 PHP 将数据添加到 json

    我使用 json decode 创建一个 json 对象 在浏览了一些元素之后 我想向其中添加子元素 我该怎么做呢 取决于您传递给的选项json decode http php net manual en function json dec

随机推荐

  • SpringBoot启动Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactor

    SpringBoot启动Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactor异常原因总结 废话少说 上干货 原因一
  • 时代选出最重要 AI 100人,多位华人上榜

    来源 Time 链接 https time com collection time100 ai 编译 芯芯 编辑 靖宇 这是 AI 的时代 2022 年 没人能预料到 以大模型为代表的人工智能技术 成为这个时代独撑科技行业上行的力量 在这一
  • kubectl exec

    文章目录 kubectl exec 通过bash获得pod中某个容器的TTY 相当于登录容器 命令行 创建一个test文件 kubectl exec exec命令同样类似于docker的exec命令 为在一个已经运行的容器中执行一条shel
  • 模型的“参数”与“超参数”

    目录 前言 一 参数 与 超参数 二 模型训练与最终模型 三 参考文献 前言 起初由于团队项目临时需要 花了个一两天的时间直接仓促上手Machine Learning 最近回顾机器学习的模型评估与选择方面的内容时 才幡然发现在初识机器学习阶
  • 小程序发布后图片不显示问题

    本地图片能正常显示 发布后图片不显示 http 127 0 0 1 49287 pageframe static img apply 20 11 png 修改后 http 127 0 0 1 49287 pageframe static i
  • 获取table中的所有行中的td值,包括input值和select值等

    首先获取表对象document getElementById onceFeeTableId 然后通过循环可以获取所有的行 tableObj rows i 如果有需要可在循环里面再加一个循环 用来循环所有的列 HTML table class
  • 【Mysql 存储过程 Or 存储函数 傻傻分不清? 】

    MySQL的存储函数 自定义函数 和存储过程都是用于存储SQL语句的 但是什么时候用什么呢 是不是总是傻傻的分不清 本文来详细的讲一下存储函数 和存储过程 以后再也不会迷糊 存储函数 存储过程 一 异同点 二 存储函数 语法 三 存储过程
  • Ubuntu 20.04上安装和配置MySql5.7

    此博客作为学习笔记使用 仅供用于学习 勿用于任何非法用途 Ubuntu换源 ubuntu 20 04系统自带源直接安装是MySQL 8 0 我要安装MySQL 5 7的版本的所以先进行换源 1 1 备份原来的sorce文件 sudo cp
  • 深度之眼(四)——Python基本数据类型

  • 使用NPM发布uni-app,Vue自定义组件

    使用NPM发布uni app以及vue自定义组件 使用npm install 安装他人发布的组件平时用的比较多 操作也比较简单 最近自己捣鼓了一下 如何发布自己的自定义组件方便自己和他人使用npm install 安装 编写组件 第一步是本
  • 多线程进阶(下)

    目录 一 JUC 二 线程安全的集合类 三 死锁 一 JUC 这里的juc指的是java util concurrent 并发 多线程相关的 一个标准库中的类 下面是JUC里面的常见类 Callable 这是一个interface 也是一种
  • 样本选择模型 & 处理效应模型

    一 样本选择偏差与自选择偏差 样本选择偏差 样本选择偏差的非随机选择机制在于对样本的选择不随机 在样本数据的采集过程中 只对某部分群体进行调查 但这部分群体与其他群体在某些方面的特征差异较大 因此根据这样的样本做回归得到的普适性结论并不可信
  • iOS自定义下拉刷新控件

    自定义下拉刷新控件 概述 用了很多的别人的下拉刷新控件 想写一个玩玩 自定义一个在使用的时候也会比较有意思 使应用更加的灵动一些 毕竟谁不喜欢各种动画恰到好处的应用呢 使用方式如下 tableview refreshControl XRef
  • 运维实践

    欢迎关注 WeiyiGeek 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 全栈实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 作者主页 ht
  • 初级1 题目二 选择排序

    1 选择排序和冒泡排序很类似 不过冒泡排序是两两比较 每次确定一个元素的位置 而选择排序是一个和其他所有未确定的元素进行比较 然后确定位置 include
  • 如何提高影响力?

    一 什么是影响力 1 通俗的讲 影响力就是影响他人的能力 二 为什么需要提高 1 可以让工作更高效 2 可以让生活更惬意 三 提高影响力的切入点 1 乐于助人与虚心求教 1 1 每个人都会遇到困难 在别人遇到困难的时候 帮助其一下 不要担心
  • js 数组根据字段分组

    在平时的开发中 难免会遇到需要对接口获取的数据进行处理 例如以下数据 const arr a 系列1 b 2 c 3 a 系列2 b 2 c 3 a 系列3 b 2 c 3 我们需要对a字段进行分组 将b和c字段单独取出来 那么我们就可以用
  • 微信小程序注册入口和注册流程(完整版图文教程)

    微信小程序注册是免费的 在腾讯云微信公众平台即可注册 无论是个人 企业都可以免费注册微信小程序 先输入邮箱注册激活 然后填写主体类型对应的证件信息 最后管理员身份验证使用维信扫一扫即可 小程序5来详细说下微信小程序注册入口和微信小程序注册流
  • 下载Android特定模块的源代码

    原文地址 http www apkbus com android 18828 1 1 html 开发中要模仿Android系统中某些应用的特性 需查看其源代码 关于Android源码的介绍见 http source android com
  • Go依赖管理及Go module使用

    目录 一 依赖管理 二 为什么需要依赖管理 三 godep 3 1 安装 3 2 基本命令 3 3 使用godep 3 4 vender机制 3 5 godep开发流程 四 go module 4 1 GO111MODULE 4 2 GOP