Golang依赖管理工具之go module(go1.11)

2023-05-16

大多数语言都会有包管理工具,像Node有npm,PHP有composer,Java有MavenGradle

可是,Go语言一直缺乏一个官方的包管理(Dep被称为官方试验品official experiment)。

终于,在go1.11 版本中,新增了module管理模块功能,用来管理依赖包。

要知道,在这个之前,想要对go语言包进行管理,只能依赖第三方库实现,比如Vendor,GoVendor,GoDep,Dep,Glide等等,对于初学者来说,真的是选择困难症。

关于Workspaces和GOPATH

go1.11 之前,如果不使用第三方包管理工具可行,就是直接使用go get安装第三方包。

工作空间Workspaces,是Go项目的根目录,也就是

GOPATH是GO项目必备的环境变量,用来存放Go的开发代码和第三方包代码,代码需要按照一定的目录安排。

指定GOPATH路径:

$ echo $HOME
/Users/wangtom
$ export GOPATH=$HOME/goworkspace

查看GOPATH:

$ go env |grep GOPATH                    
GOPATH="/Users/wangtom/goworkspace"

开启module特性

要开始使用 go module 的特性, 需要先设置 GO111MODULE 环境变量。

开启 GO111MODULE

要使用go module,首先要设置GO111MODULE=on,这没什么可说的,如果没设置,执行命令的时候会有提示,这个大家应该都了解了。

创建模块

创建一个新的模块mytest:

模块命名为github.com/cnwyt/mytest,就是我们创建的GitHub仓库的路径,方便我们以后提交代码。

按照原来GOPATH开发模式,创建新的包需要放置在$GOPATH/src/github.com

创建一个目录mytest目录,并进入该命令:

$ mkdir -p $GOPATH/src/github.com/cnwyt/mytest
$ cd $GOPATH/src/github.com/cnwyt/mytest

使用 go mod init 命令初始化该模块,提示错误:

$ go mod init mytest                                                                                            
go: modules disabled inside GOPATH/src by GO111MODULE=auto; 
see 'go help modules'

开启 GO111MODULE:

这是因为,默认设置的GO111MODULE=auto, 导致 modules 默认在 GOPATH/src 路径下是不启用的。
如果需要在 GOPATH/src 也能使用modules, 需要把 GO111MODULE 环境变量设置为 on.

$ export GO111MODULE=on  
$ go mod init github.com/cnwyt/mytest   
go: creating new go.mod: module github.com/cnwyt/mytest

当然这个go模块可以创建在任意位置,不强制邀请放在GOPATH路径下。
下边我们再创建一个

调用go modules:

在GOPATH以外的模块,创建一个helloworld目录,用来调用刚刚创建的mytest模块。

$ mkdir helloworld && cd helloworld
$ vi main.go

创建一个main.go文件:

package main

import "fmt"
//import "github.com/cnwyt/mytest"

func main() {
    fmt.Println("Hello, World!");

    //mytest.ShowTest1()
}

初始化该模块,引入github.com/cnwyt/mytest模块,指定版本为latest:

$ go mod init helloworld
$ go mod edit -require github.com/cnwyt/mytest@latest

初始化后,会生成一个go.mod文件,类似npm里的package.json或者composer的composer.json的一个文件。

module helloworld

require github.com/cnwyt/mytest v0.0.0

这样直接执行go test 或者 go run main.go 会报错:

$ go test
build helloworld: cannot find module for path github.com/cnwyt/mytest

这是为啥呢? 这是因为我们虽然创建了一个名为github.com/cnwyt/mytest模块,在GOPATH路径里也有这个模块。但是,GO模块去Github去找这个模块,而不是在GOPATH路径里去找,所以找不到。

那该怎么办呢?
有两个解决办法:
第一个办法,很简单,就是直接将cnwyt/mytest模块推送的GitHub上。
但是,如果我要修改cnwyt/mytest里的代码,都得先推送到GitHub上,才能生效,实在太麻烦了。
那就直接使用第二个办法, 使用 go replace:

直接修改go.mod,新增一行replace:

module helloworld

require github.com/cnwyt/mytest v0.0.0

replace github.com/cnwyt/mytest => /Users/wangtom/goworkspace/mytest

注意版本号必须填写,可以填v0.0.0或者latest.

然后重新运行即可:

$ go test                                                    
go: finding github.com/cnwyt/mytest v0.0.0
?   	helloworld	[no test files]

备注: 因为本地没有*_test.go测试文件,所以会有提示"no test files".
这里运行go test也只是让go module去拉取最新的模块.

调用第三方模块

比如项目中会用到比较流行的路由模块 gorilla/mux:

直接修改go.mod,新增一行require,不指定版本可以直接写latest获取最新版本:

require github.com/gorilla/mux latest

运行 go buildgo test 会自动从GitHub下载模块,并会修改 go.mod 文件。

比如运行后会把 latest 直接修改成目前最新的版本 v1.6.2 :

module helloworld

require github.com/cnwyt/mytest v0.0.0
require github.com/gorilla/mux v1.6.2

replace github.com/cnwyt/mytest => /Users/wangtom/goworkspace/godict

可以看到模块gorilla/mux代码会下载到 $GOPATH/pkg/mod/ 模块下:

$ ll /Users/wangtom/goworkspace/pkg/mod/github.com/gorilla 
total 0
dr-xr-xr-x  22 wangtom  staff 704B 12 24 22:14 mux@v1.6.2

[END]

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

Golang依赖管理工具之go module(go1.11) 的相关文章

  • Python - randrange() 的空范围 (0,0, 0) 和 ValueError("randrange() 的空范围 (%d,%d, %d)" % (istart, istop, width))

    当我运行这个程序时 python 3 3 1 import random import time from random import randrange print print I am thinking of a person time
  • 导入 python 模块时如何解决 KeyError?

    我试图从不同的目录级别导入模块 所以我使用了 import os import sys sys path insert 0 os path abspath os path join os path dirname file 但现在我收到这个
  • Rails - 将模块包含到控制器中,以在视图中使用

    我对 Rails 很陌生 我尝试设置一个要在视图中使用的模块文件 所以我相信正确的行为是将模块定义为控制器中的助手 瞧 它应该可以工作 然而 对我来说情况并非如此 这是结构 lib functions form manager rb 表单管
  • Webpack 5 - 资产模块 - 缺少 url-loader 功能 - postTransformPublicPath

    我想按照建议切换到 webpack 5 asset 模块 不幸的是我错过了 webpack url loader 的函数 postTransformPublicPath path any gt any 由于我们应用程序的结构 资产的公共区域
  • Maven 配置文件 - 如何为父级运行插件一次,为模块运行多次?

    我对詹金斯的输出有点困惑 Jenkins 上的工作 底部缩短了 pom xml mvn deploy Pprofile1 我的所有插件都会运行 4 次 父 pom xml 父 module1 pom xml 父 module2 pom xm
  • 如何在 Mac 上安装 Beautiful Soup 模块?

    我读了这篇文章但没有找到解决方案 http docs python org install index html http docs python org install index html 正常 的方法是 访问美丽汤网站 http ww
  • 导入 python 模块的特殊性?

    我一直在使用 python 的 PySerial 库pyserial API http pyserial sourceforge net pyserial api html 我似乎无法理解为什么我必须专门导入模块的某个部分 这会给我一个错误
  • 如何为自定义 Perl 模块选择一个不与内置或 CPAN 包名称冲突的包名称?

    我已阅读模块上的 perldoc http perldoc perl org perlmod html 但我没有看到关于命名包的建议 这样它就不会与内置或 CPAN 模块 包名称冲突 过去 为了开发本地Session pm模块 我使用我公司
  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 模块参数权限

    我是内核编程的新手 当我正在经历module param 我对权限值 0 感到困惑 有人解释说它不会在 sysfs 中获得条目 而其他人则喜欢S IRUGO将获得一个条目 我无法理解这个概念 perm 值 0 表示什么 我们什么时候需要 s
  • 如何在 erlang 中安装模块?

    我是 Erlang 新手 想知道如何安装第三方模块以在我的 Web 应用程序中使用 您将这些文件放在哪里以及执行什么类型的命令 如果您希望在系统范围内安装第 3 方库 例如 Mochiweb 最好将其设置在 ERL LIBS 环境变量下 我
  • 模块化大型 Grails 应用程序的最佳实践?

    我正在开发的 Grails 应用程序变得相当大 最好将其重构为几个模块 这样我们就不必每次都重新部署整个事情 将 Grails 应用程序拆分为多个模块的最佳实践是什么 特别是 我想创建一个域类 相关服务的包 并将其作为模块在应用程序中使用
  • K2_内容模块评级

    我一直在category item php 中重建标准K2 评级 以查看评级从显示为星星到显示为数字 我所做的是 我替换了这段代码 div div class itemRatingForm ul class itemRatingList l
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • 无法在 Golang 中导入本地模块

    我正在尝试导入本地模块 但无法使用以下命令导入它go mod 我最初使用以下方式构建了我的项目go mod init github com AP Ch2 GOMS 注意我的环境是go1 14我使用 VSCode 作为我的编辑器 这是我的文件
  • Python 中 `if name == "__main__"` 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 name main gt 做什么 https stackoverflow com questions 419163 what does if name main do 我已经用 Python 编写脚本
  • 在 Rust 中使用父目录中的模块

    是否可以以这种方式构建 Rust 项目 目录结构 src a bin1 rs b bin2 rs common mod rs 来自 Cargo toml bin name bin1 path src a bin1 rs bin name b
  • 为所有用户持久安装 PowerShell 模块

    我正在通过以下方式安装 PowerShell 模块八达通部署 http octopusdeploy com 到许多不同的服务器上 出于测试目的 我按照 Microsoft 文档的指导进行了安装PowerShell模块 https learn
  • 在 config/main.php 中找不到 Yii2 模块(不在 /vendor 文件夹下)类

    我在 api 文件夹下创建了一个模块 它本身与 yii2 高级应用程序中的后端和前端处于同一级别 文件夹结构 api 常见的 控制器 楷模 配置 模块 v1 控制器 楷模 运行 测试 网络 在 api config main php 中 r

随机推荐

  • 嵌入式Linux系统开发笔记(十四)

    U Boot环境变量 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs xff0c bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的 xff0c 里面有很多的变量引用 xff0c 这些
  • 嵌入式Linux系统开发笔记(十五)

    Linux内核启动验证 5 1 编译内核 span class token comment 清除工程 span span class token comment make distclean span span class token co
  • 嵌入式Linux系统开发笔记(十六)

    根文件系统rootfs启动验证测试 接下来我们使用测试一下前面创建好的根文件系统 rootfs xff0c 测试方法使用 NFS 挂载 6 1 检查是否在Ubuntu主机中安装和开启了NFS服务 xff08 特别注意 xff1a nfs 配
  • 安卓5.0以上7.0以下使用Termux

    参考 xff1a https zhuanlan zhihu com p 400507701 说明 xff1a Termux支持5 0以上的安卓系统 Termux7 3版本之后 xff0c 仅支持7 0以上的安卓系统 1 安装Termux 设
  • 关于DSP的CCS6.0平台下的工程搭建(完全可移植)

    本工程以CCS6 0下新建TMS320F28335工程为例 xff0c 其他系列处理器工程搭建类似 xff0c 参考本例即可 工程搭建用到的F2833x TI官方库文件 下载链接 也可直接参考笔者搭建好CCS6 0的工程 下载链接 所建工程
  • STM32Fxx JTAG/SWD复用功能重映射

    问题描述 xff1a 在实验室调车过程中 xff0c 遇到的一个问题 xff1a 为了每次下载程序方便 xff0c 队员们往往会把 Jlink 插在板子上 xff0c 可是在调车过程中发现 xff0c 有时程序会莫名死掉 xff0c 而同样
  • VS2012编译RTKLIB——GNSS定位开源库

    RTKLIB 开源库 有着强大的 GPS 数据实时和后处理功能 xff0c 由于 笔者的毕业设计中需要对GPS 载波相位观测量进行 RTK 解算 xff0c 故而 xff0c 对 RTKLIB 开源库进行了学习与研究 RTKLIB 提供了很
  • 51单片机串行口波特率计算

    1 工作方式介绍 xff1a 方式 0 xff1a 这种工作方式比较特殊 xff0c 与常见的微型计算机的串行口不同 xff0c 它又叫 同步移位寄存器输出方式 在这种方式下 xff0c 数据从 RXD 端串行输出或输入 xff0c 同步信
  • 解决HTTPS证书安全检测时提示 PCI DSS 不合规问题

    解决HTTPS证书安全检测时提示 PCI DSS 不合规问题 今天在进行HTTPS证书安全检测时 xff0c 提示PCI DSS不合规 经查询得知是因为SSL配置时启用了TLS1 0导致的 关于 PCI DSS 自2018年6月30日起 x
  • 数码管显示问题总结

    1 数码管显示原理 我们最常用的是七段式和八段式 LED 数码管 xff0c 八段比七段多了一个小数点 xff0c 其他的基本相同 所谓的八段就是指数码管里有八个小 LED 发光二极管 xff0c 通过控制不同的 LED 的亮灭来显示出不同
  • 多种方式登陆模块设计

    多种方式登陆模块设计 目录 多种方式登陆模块设计 目录参考了一些资料总结一下 1 使用 用户名邮箱手机号 密码 登陆2 第三方登陆 mob文档中还有以下描述 思考 参考了一些资料 知乎 第三方一键登录如何保证产品的唯一ID xff1f 开源
  • P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为
  • RUST 是 JavaScript 基建的未来

    这里写自定义目录标题 1 RUST 是 JavaScript 基建的未来1 1 Rust 是什么 1 2 Adoption1 3 从 JavaScript 到 Rust1 4 SWC1 5 Deno1 6 esbuild1 7 Rome1
  • VNC XRDP

    2个可以远程到linux上的远程桌面 xff0c 我都在我的raspi2上实现了 xff0c 这2个软件在我看来都差不多 xff0c 都可以满足我的要求 xff0c 只不过一个需要在windows上安装客户端VNC VIEWER xff0c
  • [Python学习]基础一: 循环

    34 if 语句可以嵌套 xff0c 但是不推荐 2 xff09 python 没有switch语句 3 xff09 循环语句 重复的执行某一个固定的动作或者任务 分类for while 4 xff09 for循环 for 变量 in 序列
  • springboot配置mysql数据库spring.datasource.url报错处理

    spring datasource url 61 jdbc mysql abc 3306 abcd useUnicode 61 true amp characterEncoding 61 utf8 很常规地配置了这个mysql的url后发现
  • 从jar包中读取文件的几种方式

    写在前面 本文会用到这篇文章 1 xff1a 从自身读取文件 1 1 xff1a 定义读取的文件 1 2 xff1a 读取代码 span class token annotation punctuation 64 SpringBootApp
  • Win10环境安装Anaconda(3-2021.05)+Tensorflow(2.6)

    Win10环境安装Anaconda 3 2021 05 43 Tensorflow 2 6 在学习机器学习的过程中会用到许多Python库 xff0c 例如tensorflow pandas等 xff0c 用到的时候单独去安装十分不方便 x
  • VIM中字符串的替换

    VIM中字符串的替换 字符串的替换 span class token number 1 span span class token function vim span 中可用 s 命令来替换字符串 xff0c 具体如下 xff1a s st
  • Golang依赖管理工具之go module(go1.11)

    大多数语言都会有包管理工具 xff0c 像Node有npm xff0c PHP有composer xff0c Java有Maven和Gradle 可是 xff0c Go语言一直缺乏一个官方的包管理 Dep被称为官方试验品official e