国内关于gomod的文章,哪怕是使用了百度 -csdn,依然全是理论,虽然golang的使用者大多是大神但是也有像我这样的的弱鸡是不是?

所以,我就写个傻瓜式教程了。

github地址:https://github.com/247292980/go_moudules_demo

代码很少很简单。。。。

环境变量 GO111MODULE,有三个值on,off,auto,很好理解,不配置的话默认是auto

步骤

1.新建文件夹 go_moudules_demo

2.go mod之,生成go.mod文件

go mod init go_moudules_demo
语法
go mod init [module]

3.创建main.go,默认包名是gomod,需要改成main

4.创建正真的存放代码的文件夹 demo和文件gomod.go,注意不能与main放在同一文件夹下,因为会造成包名冲突

5.根据规则引入代码,这里有个坑,因为goland做的不太好,实际上golang的所有工具都做的不太好,导致代码报红,但是实际上go build/run还是能跑通的

当然goland也可以配置

总结

gomod最容易让人进了误区就是,把自己之前的代码都gomod一次,那么后面使用的时候直接根据gomod的package找之前的代码,简直美滋滋。

毕竟是go moudules但是,实际上只是go moudule,他只管一个项目里的多个包。

为什么造成这个误区呢?因为国内说的都是包管理,我还真以为是针对包的操作,然后第一次尝试失败后,翻了下官网

A module is a collection of related Go packages. 
Modules are the unit of source code interchange and versioning.
The go command has direct support for working with modules, including recording and resolving dependencies on other modules.
Modules replace the old GOPATH-based approach to specifying which source files are used in a given build.

 a collection of related Go packages. 相关Go包的集合,这玩意的理解真的是难,什么相关,相关的是什么?这时候根据官网的usage代码反向理解下go mod init [module],显然是 module的相关Go包的集合,而module是一个单数啊。。。module和go mudules。。。我该如何理解啊。。。模板我倒是知道。。。总感觉这个怪不到谷歌头上,而且这玩意大家试个两下,就能找到正确理解也不算什么事。而且我要是把自己的代码都丢到github上同样不会报错,只是我是想着不丢到github上面的使用所以进了歪路。

而第二句Modules are the unit of source code interchange and versioning. Modules是源码的版本控制和交换的单位,也就说明go mod之间是独立的,,,不能互调,除非在gopath里面。感觉大神看到这句两下都不用试了。。。

四 语法解析

主要是一个人的博客 http://blog.51cto.com/qiangmzsx/2164520?source=dra

我把其中的关键抽出来,去掉他的代码,有兴趣的可以去原文看看

    go mod init:初始化modules
go mod download:下载modules到本地cache
go mod edit:编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph:以文本模式打印模块需求图
go mod tidy:检查,删除错误或者不使用的modules,下载没download的package
go mod vendor:生成vendor目录
go mod verify:验证依赖是否正确
go mod why:查找依赖 go test 执行一下,自动导包 go list -m 主模块的打印路径
go list -m -f={{.Dir}} print主模块的根目录
go list -m all 查看当前的依赖和版本信息

五 gomod import另一个gomod

似乎只能push到github或者使用类似gopath的方式,看了一圈没有说gomod能import本地的gomod。

六 gomod遇到内部包的时候,报use of internal package xxxx not allowed

https://github.com/golang/go/issues/26446 解决方法。

同样gay网大神指出

github.com/garyburd/redigo is not allowed to access github.com/gomodule/redigo/internal 
because github.com/gomodule/redigo is not a prefix of github.com/garyburd/redigo:this is working as designed.
If you intend for github.com/garyburd/redigo to replace github.com/gomodule/redigo, you'll need to use a replace directive and import via the latter path.

也就是说要使用go mod edit -replace

go mod edit -replace=github.com/garyburd/redigo@v2.0.0=github.com/gomodule/redigo@v2.0.0

但是此时会报

go: github.com/gomodule/redigo@v2.0.0+incompatible used for two different module paths (github.com/garyburd/redigo and github.com/gomodule/redigo)

说真的我很想打人地说,又是你说要改成replace但是你现在只是换了个报错,这么敷衍的吗?

然后,我想了想,换个版本号?

go mod edit -replace=github.com/garyburd/redigo@v2.0.0=github.com/gomodule/redigo@v1.6.0

程序成功运行!

这时候我发现了一句话

I'm planning to fix this before the final 1.11 release, but it might not make beta2.

go的大神说在1.11的最新版本之前会修复,但不在beta2(当前),此时我看到是9天前,而这bug整了我至少3天,,,

第一次追上大神的开发脚印?可喜可贺可喜可贺啊

七 go proxy

GOPROXY=https://goproxy.io

gomodules配上goproxy就可以免翻墙拉大多数包了,看名字很多人觉得就是proxy而已,但是,在go2.0的计划中,https://goproxy.io十有八九要变成像maven那样的东西,因为只有这样才能更好的和gomodules配合做包管理工具

傻瓜式的go modules的讲解和代码,及gomod能不能引入另一个gomod和gomod的use of internal package xxxx not allowed的更多相关文章

  1. 强大的jQGrid的傻瓜式使用方法。以及一些注意事项,备有相应的引入文件。

    在介绍我的使用前,先按照国际惯例,列上网址http://blog.mn886.net/jqGrid/ 里面第一项就有相应的demo. 好,进入正题: 在学习到node.js的时候,需要使用到jQGri ...

  2. Webpack 傻瓜式指南(一)

    modules with dependencies   webpack   module bundler   static  assetss   .js .js .png Webpack傻瓜式指南 n ...

  3. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  4. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  5. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  6. MacOS安装Docker傻瓜式教程

    最近电脑越来越卡了,为了减少系统开销,以及后期维护方便,所以考虑将本地安装一些服务迁移到docker中去管理,这一切的基础是要先有docker服务,所以本文就先记录怎样在mac上安装配置docker, ...

  7. webpack之傻瓜式教程

    接触webpack也有挺长一段时间了,公司的项目也是一直用着webpack在打包处理,但前几天在教新人的情况下,遇到了一个问题,那就是:尽管网上的webpack教程满天飞,但是却很难找到一个能让新人快 ...

  8. NOSDK--关于android傻瓜式的分包设想

    一直以来,我总是以“够用就好”为理由,很少再维护过自己的一键打包的项目.最近接触了棱镜的sdk,感觉将apk包上传到棱镜服务器,后台来进行分包这种简单的方式很招人待见. 原理似乎不难,apk即zip压 ...

  9. 傻瓜式操作Nagios

    傻瓜式操作Nagios   不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...

随机推荐

  1. 忘记mysql密码,但是可以用navicat修改MySQL密码

    1.首先:要知道你的账户 2.打开可以连接的navicat,在查询语句页面,输入以下操作,就可以修改成功密码了

  2. python 基础 进程与线程

    多进程 使用multipprocessing模块创建多进程 multiprocessing模块提供了一个Process类来描述一个进程对象.创建子进程时,需要传入一个执行函数和函数的参数.用start ...

  3. .net 缓存之数据库缓存依赖

    当监听的指定数据库内容某张表变化时就更新缓存 先来配置数据库,启动监听服务(SQL2008下) 执行如下语句: ALTER DATABASE OumindBlog SET NEW_BROKER WIT ...

  4. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句

    请定义一个宏,比较两个数的a.b的大小,不能使用大于.小于.if语句 方法一:    #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b): ...

  5. Spring pom配置详解(转)

    转载至http://blog.csdn.net/ithomer/article/details/9332071# 原博主注释的很详细 <project xmlns="http://ma ...

  6. Jmeter分布式测试需要注意事项

    Jmeter分布式测试需要注意事项: 1. 如果脚本中有用到CSV Data Set Config,则所有的模拟机都必须在相应的目录下存在该文件.如下图,则必须所有模拟机的F盘下都有user.txt文 ...

  7. 在虚拟机环境(CentOS7系统)下将kubernetes中部署服务成功,但在虚拟机外部无法访问到服务

    在CentOS7环境下,kubernetes单机版环境,成功部署一个服务,在虚拟机中访问服务没问题,下面这样: curl http://172.27.73.26:8888/eureka-server/ ...

  8. [WIP]php 基本语法

    创建: 2019/06/14 https://www.php.net/manual/zh/langref.php php标记   当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?ph ...

  9. Docker 容器的数据卷

    数据卷的特点: 1. 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中 2. 数据卷可以在容器之间共享和重用 3. 可以对数据卷里的内容直接进行修改 ...

  10. bzoj4435: [Cerc2015]Juice Junctions(最小割树+hash)

    传送门 首先最大流等于最小割,那么可以转化为最小割树来做(不知道什么是最小割树的可以看看这题->这里) 具体的做法似乎是$hash[i][j]$表示最小割为$i$时点$j$是否与$S$连通 然后 ...