当前位置: 首页 > news >正文

【Golang】go mod的使用

【1】GO111MODULE有三个值:off, on,  auto
                off:go命令行将不会支持module功能,将会使用旧版本那种通过vendor目录或者GOPATH来查找依赖包的方式。
                on:go命令行会使用modules功能,而不再去GOPATH目录下查找依赖包。
                auto(默认值):go命令行将会根据当前目录来决定是否启用module功能。在以下两种情形下使用module功能:a、当前目录在GOPATH/src之外,且该目录包含go.mod文件;b、当前文件在包含go.mod文件的目录下面。

【2】初始化模块:

        go mod init whz_test(模块名称)

        在当前目录会生产一个go.mod文件,同时还有一个go.sum文件。     
        go.mod和go.sum都应该加入到版本控制,但go.sum不需要手工维护。
        子目录是不需要go mod init的,所有子目录中的依赖都会组织在根目录的 go.mod 文件中。

        创建go.mod文件后,直接go run 或 go build 将会自动下载依赖包,并将依赖关系和版本写到go.mod和go.sum文件中。

【3】其他命令:

        go mod download: 下载依赖包
        go mod graph: 打印模块依赖图
        go mod tidy: 拉取缺少的模块,移除不用的模块
        go mod vendor: 将依赖复制到vendor下
        go mod verify: 验证依赖是否正确
        go mod why: 解释为什么需要依赖

【4】go.mod文件中支持4个命令:
        module语句指定包的名称(即路径)
        require语句指定依赖项模块
        replace语句可以替换依赖项模块:不包含某个版本等
        exclude语句可以忽略依赖项模块:排除一个特定的模块依赖,用此指明不拉取该版本

【5】举例:go.mod文件内容
        --------------------------------------
        module whz_test

        go 1.19

        require (
                github.com/hashicorp/go-multierror v1.1.1
                ...
                github.com/samber/lo v1.37.0
        )

        require (
                github.com/hashicorp/errwrap v1.0.0 // indirect
                github.com/modern-go/reflect2 v1.0.2 // indirect
                golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
        )

        exclude golang.org/x/time v0.3.0
        replace golang.org/x/sync v0.1.0 => gitee.com/x/sync v0.1.0
        replace golang.org/x/sync v0.1.0 => /User/local/...
        --------------------------------------
        [说明]
        (1)在require语句间接引入的,会有indirect标识;
        (2)replace语句可解决:对应依赖模块网络问题拉取不到,换个地方拉取;本地调试,不想发布到仓库。

【6】go.mod文件生产后,拉取指定的依赖,常用的命令:
        go get                只拉取(更新)直接依赖
        go get -u            拉取(更新)直接依赖和间接依赖模块
        go get -u -t ./...   拉取(更新)直接依赖和间接依赖模块,包括单元测试中用到的。
        (go get拉取依赖不需要精准指定依赖版本,可自动推断对应的版本号)
    
        拉取指定版本的命令:
        go get http://golang.org/x/text@latest          拉取最新的版本,若存在tag,则优先使用。
        go get http://golang.org/x/text@master        拉取 master 分支的最新 commit。
        go get http://golang.org/x/text@v0.3.2         拉取 tag 为 v0.3.2 的 commit。
        go get http://golang.org/x/text@342b2e       拉取 hash 为 342b231 的 commit,最终可能转换为 v0.3.2。

【7】go mod模式下,goland可能会出现的问题:

        使用go mod下载了指定的依赖后,在goland中提示错误,无法关联到这个依赖,不过在goland以及命令行都可以编译运行。

        goland版本:2024.2. 

        检查goland的设置:
         (1)在File->Settings设置了Global GOPATH使用了系统的环境变量:
                            [GOPATH]C:\whz_go_path
         (2)使用go mod下载了依赖包:github.com/gin-gonic/gin
                    经检查,已经成功安装到了GOPATH路径了:
                            C:\whz_go_path\pkg\mod\github.com\gin-gonic\gin@v1.10.0    
         (3)在命令行编译成功,在goland中也可以编译运行成功,但是代码中main.go显示红色波浪线,提示有错误,无法解析依赖库“github.com/gin-gonic/gin“。
         (4)经检查,是因为File->Settings->Go->GoModules设置中没有勾选以下选项:
                            Enable Go modules integration
                    勾选后问题解决。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 性能测试 —— linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台!
  • Spring Boot集成钉钉群通知机器人
  • Vue2 和 Vue3 自定义指令比较
  • 昂科烧录器支持PAI-IC澎湃微电子的32位微控制器PT32L031K6T6
  • 多模态论文自己学习路程_每天推出新版本_请看当天版本
  • 【vue3|第23期】Vite + Vue3: 深入理解public和assets文件夹的作用与使用
  • 安装postgresql和PGVector
  • Linux线程基础学习记录(线程的创建、回收以及结束)
  • C#中的S7协议
  • 【计算机网络】应用层自定义协议与序列化
  • 批量查询全国快递单号:高效追踪物流信息
  • HarmonyOS应用开发学习-ArkUI-容器组件
  • springboot的学习(二):常用配置
  • 【算法 04】汉诺塔递归求解和通式求解
  • 【Linux基础】Linux中的开发工具(1)--yum和vim
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [LeetCode] Wiggle Sort
  • Angular 响应式表单 基础例子
  • Apache的80端口被占用以及访问时报错403
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • js ES6 求数组的交集,并集,还有差集
  • js递归,无限分级树形折叠菜单
  • js学习笔记
  • MySQL几个简单SQL的优化
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue.js 移动端适配之 vw 解决方案
  • vue-loader 源码解析系列之 selector
  • Zepto.js源码学习之二
  • 从输入URL到页面加载发生了什么
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前嗅ForeSpider教程:创建模板
  • 巧用 TypeScript (一)
  • 新手搭建网站的主要流程
  • 一些css基础学习笔记
  • ​比特币大跌的 2 个原因
  • (1)Android开发优化---------UI优化
  • (10)STL算法之搜索(二) 二分查找
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fread与fwrite详解
  • (PADS学习)第二章:原理图绘制 第一部分
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读11/100)Fast R-CNN
  • (七)Activiti-modeler中文支持
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET Micro Framework初体验
  • .net 程序发生了一个不可捕获的异常
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .sdf和.msp文件读取
  • @ComponentScan比较
  • [001-03-007].第07节:Redis中的事务