Go Modules详细理解

正在或即将被使用的Go依赖包管理方法:Go Modules,Go 1.13的标准特性 公众号原文地址:https://mp.weixin.qq.com/s/SGGV3tWEg5AAJ7I_FcK0cg 目录 目录 说明 初始化 依赖包的默认导入 依赖包的特定版本导入 查看已添加依赖 依赖包的存放管理 依赖包的版本切换 删除未使用依赖包 引用项目中的 package 引用不同版... 阅读详情

Go Modules介绍

Go Modules官方介绍:https://github.com/golang/go/wiki/Modules#semantic-import-versioning

 

Go Modules是Go语言中正式官宣的项目依赖解决方案,Go modules(前身vgo)于Go1.11版本正式发布,在Go1.14版本以后建议用在生产上,Go官方也鼓励用户从其他依赖管理工具迁移到Go modules

 

Go Modules使用

 Go modules使用的前提是Go JDK版本必须在1.11及以上版本,最好是1.13或以上

 

一、 Go modules相关的命令

go help mod我们可以看到go mod的使用及参数

 

go mod参数命令

go mod download   下载 go.mod 文件中指明的所有依赖

go mod edit      编辑 go.mod 文件

go mod graph      查看现有的依赖结构

go mod init    生成 go.mod 文件

go mod tidy   整理现有的依赖,无用的依赖包会被删除,没有的依赖会自动下载

go mod vendor    导出项目所有的依赖到vendor目录

go mod verify   校验一个模块是否被篡改过

go mod why  查看为什么需要依赖某模块

 

其他相关的指令

go list -m all     查看直接或间接依赖的模块的最终版本信息

go list -u -m all   查看直接或间接依赖的模块及可升级的模块

 

Go modules相关的环境变量

> go env



GO111MODULE="auto"

GOPROXY="https://proxy.golang.org,direct"

GONOPROXY=""

GOSUMDB="sum.golang.org"

GONOSUMDB=""

GOPRIVATE=""

......

 

GO111MODULE

Go语言提供了 GO111MODULE 这个环境变量来作为 Go modules 的开关,其允许设置以下参数:

auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在 Go1.11 至 Go1.14 中仍然是默认值。

on:启用 Go modules,推荐设置,将会是未来版本中的默认值。

off:禁用 Go modules,不推荐设置。

注:GO111MODULE 这个命名代表着Go语言在 1.11 版本添加的,针对 Module 的变量,属于过渡变量,以后的版本可能会把111去掉。

 

GOPROXY

这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取。

 

GOPROXY 的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是 proxy.golang.org 在国内是无法访问的,因此这会直接卡住你的第一步,所以你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理

目前国内支持Go Modules代理仓库比较好的有:

七牛的:https://goproxy.cn

阿里的:https://mirrors.aliyun.com/goproxy/

 

设置国内Go Modules代理

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

 

go env会持久化所设置的环境变量,通过go env设置的环境变量会保存在一个env文件中,windows保存的路径是:用户目录\AppData\Roaming\go\env  , linux保存的路径是:用户home目录下的 ./config/go/env 。 (如linux root用户的目录为/root/.config/go/env)。

GOPROXY允许设置多个代理,多个代理之间用逗号分隔,如果你想禁用Go模块代理可以将其设置为”off”。

direct 是一个特殊的指示符,用于指示Go回源到模块版本的源地址去抓取(比如GitHub等)

 

GOSUMDB

它的值是一个 Go checksum database,用于在拉取模块版本时(无论是从源站拉取还是通过 Go module proxy 拉取)保证拉取到的模块版本数据未经过篡改,若发现不一致,也就是可能存在篡改,将会立即中止。

GOSUMDB 的默认值为:sum.golang.org,在国内也是无法访问的,但是 GOSUMDB 可以被 Go 模块代理所代理。因此我们可以通过设置 GOPROXY 来解决,而先前我们所设置的模块代理 goproxy.cn 就能支持代理 sum.golang.org。如果想要禁止Go在后续操作中校验模块版本,则可以将其设置为 off

 

GONOPROXY/GONOSUMDB/GOPRIVATE

这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。

而一般建议直接设置 GOPRIVATE,它的值将作为 GONOPROXY 和 GONOSUMDB 的默认值,所以建议的最佳姿势是直接使用 GOPRIVATE。多个值可以用逗号分隔

例如:

go env -w GOPRIVATE=”git.myself.com,github.com/myself/project”

 

也可以通过通配符进行模糊匹配

go env -w GOPRIVATE="*.myself.com"

 

 

二、开启 Go Modules

目前 Go modules 并不是默认开启,因此Go语言提供了 GO111MODULE 这个环境变量来作为 Go modules 的开关,其允许设置以下参数:

  1. auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在Go1.11至 Go1.14 中仍然是默认值。
  2. on:启用 Go modules,推荐设置,将会是未来版本中的默认值。
  3. off:禁用 Go modules,不推荐设置。

 

go env 可以查看当前GO111MODULE变量的值

设置GO111MODULE环境变量的值

go env -w GO111MODULE=auto/on/off

linux系统也可通过 export设置系统环境变量

export GO111MODULE=auto/on/off

windows系统可以通过set 设置环境变量(暂时的,非持久化)

set GO111MODULE=auto/on/off

 

三、Go Modules使用示例

先检查GO111MODULE和GOPROXY变量是否已经设置

1. 新建项目gomodtest

main.go

main.go

package main


import (
       "github.com/sirupsen/logrus"
)


func main() {
       logrus.Info("hello mod")
}

 

该项目用了一个常用的日志框架logrus,并打印”hello mod”

 

2.初始化go mod

> go mod init

go: creating new go.mod: module gomodtest

 

会生成go.mod文件,文件内容如下:

module gomodtest


go 1.13

3.下载第三方包

> go get -u ./...

更新直接或间接的依赖包

go: finding github.com/sirupsen/logrus v1.6.0

go: downloading github.com/sirupsen/logrus v1.6.0

go: extracting github.com/sirupsen/logrus v1.6.0

go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.3

go: downloading golang.org/x/sys v0.0.0-20190422165155-953cdadca894

go: extracting github.com/konsorten/go-windows-terminal-sequences v1.0.3

go: extracting golang.org/x/sys v0.0.0-20190422165155-953cdadca894

go: finding github.com/konsorten/go-windows-terminal-sequences v1.0.3

 

下载所需的依赖包之后,go.mod文件中会新增如下内容

require github.com/sirupsen/logrus v1.6.0

并且生成了go.sum文件

 

下载的依赖包会缓存到第一个$GOPATH/pkg/mod 和 $GOPATH/pkg/sumdb目录中

注:go get未指定版本号,则默认下载最新的版本

注:这里为什么使用go get,而不用go mod download或go mod tidy。go get会直接更新或拉取对应的依赖模块,并将更新的模块同步到到go.mod和go.sum文件中。而go mod download是根据go.mod的内容来更新对应的模块。

 

4.go mod vendor

> go mod vendor

导出项目所有的依赖到vendor目录,此时该项目会生成vendor目录,并将所需的依赖包复制到该vendor目录下。

 

此时程序即可正常运行,运行结果如下:

time="2020-07-15T15:56:34+08:00" level=info msg="hello mod"

 

 

四、go.mod文件

一个常用的go.mod结构如下:

module github.com/eddycjy/module-repo



go 1.13



require (

    example.com/apple v0.1.2

    example.com/banana v1.2.3

    example.com/banana/v2 v2.3.4

    example.com/pear // indirect

    example.com/strawberry // incompatible

)



exclude example.com/banana v1.2.4

replace example.com/apple v0.1.2 => example.com/fried v0.1.0

replace example.com/banana => example.com/fish

module:用于定义当前项目的模块路径。

go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。

require:用于设置一个特定的模块版本。

exclude:用于从使用中排除一个特定的模块版本。

replace:用于将一个模块版本替换为另外一个模块版本。

另外你会发现 example.com/pear 的后面会有一个 indirect 标识,indirect 标识表示该模块为间接依赖,也就是在当前应用程序中的 import 语句中,并没有发现这个模块的明确引用。

 

五、Go Modules下的go get

在拉取项目依赖时,你会发现拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取)。

 

 

go get 的拉取行为

刚刚我们用 go get 命令拉取了新的依赖,那么 go get 又提供了哪些功能呢,常用的拉取命令如下:

命令

作用

go get

更新直接的模块依赖

go get -u

更新直接或间接的依赖模块

go get -u -t ./...

更新所有直接依赖和间接依赖的模块版本,包括单元测试中用到的。

      

go get 拉取指定版本

命令

作用

go get golang.org/x/text@latest

拉取最新的版本,若存在tag,则优先使用。

go get golang.org/x/text@master

拉取 master 分支的最新 commit。

go get golang.org/x/text@v0.3.2

拉取 tag 为 v0.3.2 的 commit。

go get golang.org/x/text@342b2e

拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2。

 

 

 

感谢:

https://blog.youkuaiyun.com/RA681t58CJxsgCkJ31/article/details/104568182

Go开发工具终极对决:GoLand与VSCode深度评测 本文对Go语言两大主流开发工具GoLand与VSCode进行了全方位深度评测。从安装配置、代码智能补全、调试测试、插件生态到性能资源消耗,详细对比了专业IDE与轻量编辑器的核心差异。文章旨在帮助开发者根据自身项目需求、技术栈及使用习惯,在GoLand的开箱即用与VSCode的高度定制化之间做出明智选择。 阅读详情

相关推荐

群晖NAS硬盘挂了别慌!用Ubuntu 18外接USB保姆级数据抢救指南

本文提供群晖NAS硬盘故障时的数据抢救指南,详细介绍了使用Ubuntu 18外接USB硬盘盒的完整流程。从构建救援环境、硬盘识别到数据迁移策略,涵盖关键步骤和实用技巧,帮助用户零成本恢复重要数据。特别适合非RAID配置的单盘故障场景。

9o8p7i6u5y的博客 1147

如何理解GO MOD?

createdtime 20211021 updatedtime 20211021 author venki.chen 一、是什么 1. 定义,是做什么用的? 定义: go mod能管理的依赖包的版本,能保证在不同地方构建,获得的依赖模块是一致的,集成在go tool中。go version >= 1.11,go1.13已经默认开启。 模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modu..

陈文小超的博客 1263

使用 DeepSeek 配合 即梦AI 生成视频的详细教程

访问即梦AI官网,选择“AI作图”功能,将DeepSeek生成的提示词逐条粘贴至输入框,选择适配的模型(如“通用XL Pro”)和参数(如画幅比例、风格强度)1113。“我要制作一个关于普洱茶文化的宣传视频,请设计一个30秒的脚本,包含时间轴、画面描述、文案和分镜提示词,以表格形式输出。:云南古茶树群,清晨薄雾,金色晨光,露珠特写,国风山水画质感,16:9画幅,使用Nikon D850参数模拟513。:结合DeepSeek生成的知识点脚本与即梦AI的插画风格,制作科普动画211。

weixin_48995695的博客 3万+

go-micro框架简介

go-micro

gcl的博客 1628

EDA课程实验:《数字逻辑电路》实验四___基于Minisys 平台 VIVADO工具与Verilog语言

(4)使用 Verilog HDL 实现一个分频器 clock_div,输入的是系统提供的 100MHz 频率,输出的是 1Hz 频率,占空比是 1:2,(实际上可以用一个加 1 计数器来实现降频,输入的是一个 100MHz 频率的方波,对这 个方波计数 1 亿次刚好到 1 秒(1Hz),题目要求输出频率占空比是 1:2,也就是这个 1Hz 的 方波高电平和低电平各 500ms,可以采用计数到中间值的时候输出电平翻转。(1)1) 拨动 SW1~0 为 01,按下 P4 按钮,GLD1~0 为 01;

ssjy_的博客 1298

U-Net图像分割实战:从论文解析到PyTorch代码实现

本文深入解析了U-Net图像分割模型的经典架构与核心思想,并提供了从零开始的PyTorch代码实现教程。通过详细拆解编码器-解码器结构、跳跃连接等关键组件,手把手指导读者构建完整的U-Net网络,涵盖数据准备、模型训练、推理部署全流程,是掌握图像分割实战技能的实用指南。

fire9的博客 343

Go语言基础知识一

new可以为任何类型的值开辟内存并返回此值的指针。new申请的值均为零值,对创建映射和切片没有意义。实际工作中通常使用字面量来创建数组而很少使用new。字符串字面量rune字面量//a,b,c的ASCII码值的十进制分别是97,98,99,对应的8进制为141,142,143//对于字符串abc我们可以通过//a,b,c的ASCII码值的十进制分别是97,98,99,对应的16进制为61,62,63//unicode也是通过16进制的码值表示的字符串字面量不支持单引号转义。

Xuan2096的博客 1199

企业微信API实战:解密external_userid的跨应用一致性管理

本文深入探讨企业微信API中external_userid的跨应用一致性管理问题,解析其本质及在不同应用场景下的ID不一致挑战。通过ID转换与统一管理方案,结合unionid实现跨应用客户数据整合,提供实战代码示例和架构设计,助力企业构建高效的客户管理系统。

weixin_29258297的博客 638

2024年Go最新【Go语言入门教程】Go语言简介(1),Golang开发者值得深入思考的几个问题

Go语言的编译过程其实是非常有趣并且值得学习的,通过对Go语言四个编译阶段的分析和对编译器主函数的梳理,我们能够对 Golang 的实现有一些基本的理解,掌握编译的过程之后,Go语言对于我们来讲也不再那么神秘,所以学习其编译原理的过程还是非常有必要的。

qq_38197819的博客 1193

World Action Model:经典论文

郑困时,图prorpt为机量人压务时,退过驱制解弱词表(constrsinsd decoding), 强附模型只从.256个者动作token中保H, B象总注活地。始VLA之一,RT-2使用了大量的五联网VQ据与少里的机械网的AcSonDat行CoFine-Tunng, 独组sl, 共i744个episode,Mous使用三个专累模,分是vidogonmedel,actonesget,understandng。包的核定之的的观到沟血黄动作,预之后现(vorlemodel),tseing,2。

u013250861的博客 410

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1179

Go 包操作之如何拉取私有的Go Module

我们统一将私有 Go Module 放在下面的代码仓库中。那么,接下来的问题就是,当 goproxy 去拉取时,应该得到对应的内部 VCS 上module1仓库的地址,这样,goproxy 才能从内部 VCS 代码服务器上下载module1对应的代码,具体的过程如下:那么我们如何实现为私有 module 自定义包导入路径,并将它映射到内部的 vcs 仓库呢?其实方案不止一种,这里我使用了 Google 云开源的一个名为 govanityurls 的工具,来为私有 module 自定义包导入路径。

x_9876554321_的博客 449

在 ABAP CDS View 里把 Conversion Functions 用到极致:FLTP 精度、单位换算、货币换算与小数位处理的工程化实践

数据格式转换在真实项目中比业务逻辑更容易引发问题。ABAP CDS中的转换函数(如FLTP_TO_DEC、UNIT_CONVERSION、CURRENCY_CONVERSION和DECIMAL_SHIFT)可帮助在数据库层统一数据口径,避免应用层重复处理。这些函数支持数值精度治理、单位换算、货币转换和小数位调整,能显著提升报表性能并减少逻辑分散。通过将格式转换前移到数据模型层,可以确保服务层和UI层的数据一致性,同时降低接口传输错误风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2353

golang:深入理解 Go Modules 的 go.mod 与 go.sum

流行的现代编程语言一般都提供依赖库管理工具,如 Java 的 Maven 、Python 的 PIP、Node.js 的 NPM 和 Rust 的 Cargo 等。Go 最为一门新生代语言,自然也有其自己的库管理方式。

OceanStar的博客 2703

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

一文理解Go Modules的相关内容

go.mod文件的第一行通常是module指令,用于定义当前项目的模块路径。模块路径是项目的唯一标识符,通常是项目的导入路径(例如arduino代码解读复制代码作用:模块路径决定了其他项目如何导入你的代码。例如,如果模块路径是,那么其他项目可以通过来使用你的代码。

2401_89221867的博客 1263

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入理解 Go Modules 的 go.mod 与 go.sum

流行的现代编程语言一般都提供依赖库管理工具,如 Java 的 Maven 、Python 的 PIP、Node.js 的 NPM 和 Rust 的 Cargo 等。Go 最为一门新生代语言,自然也有其自己的库管理方式。在 Go 1.5 之前,Go 最原始的依赖管理使用的是 go get,执行命令后会拉取代码放入 GOPATH/src 下面。但是它是作为 GOPATH 下全局的依赖,并且 go get 还不能进行版本控制,以及隔离项目的包依赖。而随着 Go 生态圈的快速壮大,无法进行版本控制,会导致项目中的依

Doublelv 的博客专栏。 7185

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深入浅出理解 Go Modules 中 require 的三段式结构

首先,我们需要简单了解一下go.mod文件的作用。在 Go 1.11 引入模块系统后,go.mod声明模块名称(module)指定 Go 版本管理项目依赖(通过require指令)处理依赖替换(通过replace指令)等其中,require指令是管理依赖的核心,它定义了项目所依赖的所有外部包及其版本。Go 模块中require第一部分是你直接使用的核心工具第二部分是你特别关注的辅助工具第三部分是支撑整个系统的基础设施理解这种划分方式,不仅能帮助你更好地阅读和维护go.mod。

m0_57836225的博客 1092

Go Modules深度解析:理解版本选择机制的3个核心原则

掌握Go语言依赖管理的核心方法,深入解析Go Modules版本选择的三大原则。适用于项目依赖冲突解决与版本控制,提升构建可靠性。理解语义化版本、最小版本选择与主版本兼容规则,值得收藏。

LearnFlow的博客 683

GOPATH 仍是 Go 工程基石:理解 src/pkg/bin 结构与 Modules 协同机制

GOPATH 是 Go 语言工程化设计的核心约定,它通过标准化的 src/、pkg/、bin/ 目录结构,实现‘路径即身份’的包管理范式。其底层原理在于将导入路径(import path)与文件系统路径严格绑定,从而规避依赖冲突、简化构建逻辑、支撑零配置可构建特性。技术价值体现在构建缓存加速(pkg/.a)、二进制统一分发(bin/)、跨平台交叉编译支持及 Modules 的隐性基础设施支撑(如 pkg/mod 缓存根基)。典型应用场景包括 CI/CD 流水线中 go install 的可靠交付、VS Co

fanjava 447

golang-asm 开源项目教程

golang-asm 开源项目教程 本教程旨在指导您了解并使用 golang-asm,这是一个将Go编译器中的汇编器封装成库形式的项目。通过以下三个部分,我们将一起探索其结构、主要入口点以及相关配置。 1. 项目目录结构及介绍 golang-asm 的目录布局设计遵循了Go语言的标准实践,结合了源代码、测试文件以及必要的元数据文件。以下是关键目录的概览: github.com/twitchyli...

gitblog_00415的博客 491

Go Modules时代,你的GOPATH和GO111MODULE真的理解对了吗?一份避坑指南

本文深入解析Go Modules时代下GOPATH与GO111MODULE的正确使用方法,提供避坑指南。从GOPATH的传统工作模式到Go Modules的迁移策略,详细讲解GO111MODULE的三种状态差异及GOPROXY配置技巧,帮助开发者高效管理依赖并优化构建性能。

weixin_42116058的博客 247

Go Modules 终极入门

Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(rea...

Go中国 6050

Go 语言系统编程与云原生开发实战(第1篇):从零搭建你的第一个 Go 服务 —— 理解 GOPATH、Modules 与现代 Go 工作流

《Go语言:云原生时代的系统语言》 本文系统介绍了Go语言的核心特性与应用场景。Go由Google团队设计,以简单性、高效性和工程友好性为核心理念,成为云原生基础设施的事实标准语言。文章详细对比了Go与Python/Java的关键差异,突出Go在并发性能、内存占用和部署便捷性上的优势。 实践部分提供了从环境配置到项目开发的完整指南。

小二丶的博客 1303

go modules 学习

go modules 学习 tags:golang 安装 只需要golang的版本是1.11及之后的,这个模块就内置好了 环境变量 (1) 配置GoLang的GOROOT(2) 可以不配置GoLang的GOPATH(3) 配置mod模块的状态 export GO111MODULE=auto 可选值有三个:on:开启,off:关闭,auto:自动 如果是自动模式,文件夹下有go.mod则是开启状态,...

單鵬飛的博客 1817

Go Modules 详解

Go 1.11 和 Go 1.12 包含了初步的 Go Modules 支持,且计划在 2019 年 8 月发布的 Go 1.13 会在所有开发过程中默认使用 Go Modules。 Go Modules 是为了提升使用其他开发者代码,即添加 依赖项(模块、包) 时的体验,也是为了让代码的正确性、安全性得到保障。并且 Go Modules 可以使用 GOPROXY 环境变量来解决中国大陆无法使用 go get 的问题。 所以学习跟 Go Modules 有关的知识是很有必要的。 Golang Logo 模式

qq2252852775的博客 769

Go Modules

go modules

weixin_44407903的博客 153
上一篇: Golang退出多层循环
下一篇: kubeadm获取或创建加入k8s集群的token
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值