随处可见的 GO111MODULE=on

在 GitHub 上,经常看到不少项目的 readme 里都有这么一句:

✗ GO111MODULE=on go get golang.org/x/tools/gopls@latest

2009 年,Go 被官方发布的时候,没有自带包管理功能。go get 命令会根据 import 路径,把所有源码下载到$GOPATH/src目录下。这导致,我们无法对依赖包进行版本控制,只有master分支能代表一个包的稳定版本。

Go 1.11 版本中,引入了 Go Modules (即,Go 模块),可以通过 go.mod 文件存储依赖包的版本号。

从那时起,GOPATH模式Go模块模式之间的交互就成为了Go最大的陷阱之一。

要想避开这些陷阱,离不开一个环境变量——GO111MODULE

GO111MODULE=on 是干嘛用的

简单来讲,GO111MODULE=on会开启 Go 模块模式,允许用户在 go get 时指定依赖包的版本。

✗ GO111MODULE=off go get golang.org/x/tools/gopls@v0.1.8
go: cannot use path@version syntax in GOPATH mode
# 报错:GOPATH模式无法指定版本

使用 go get 时,go.mod 会自动更新

这里要小心踩坑。默认情况下,如果当前目录下有 go.mod 文件,go get 命令会把你刚刚安装的依赖包更新到 go.mod。

在 安装一些开发工具(比如gopls, kind)时,如果你不想更新 go.mod 文件,可以使用cd && go get命令避免污染 go.mod 。

go get VS go install

  • go get: 解析、添加 pkg 之间的依赖关系,然后下载、编译、安装pkg。【默认修改go.mod】
  • go install: 编译、安装 代码中import的pkg。【不修改go.mod】
# 更详细的解释,可见官方文档
✗ go help get
✗ go help install

不要在 go get 中混用 -u 和 @version

比如 在使用@latest时,你只想要更新当前包到最新tag。加上-u选项后,go会把这个包的所有依赖包也更新。如果依赖包里有breaking changes,那就坑惨了。

# 只更新 protos-go
✗ go get git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6 # 依赖包也全都更新
✗ go get -u git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6
go: github.com/golang/protobuf upgrade => v1.4.2
go: google.golang.org/protobuf upgrade => v1.23.0

再比如,如果使用@v0.1加上-u选项,go get会获取1.0标签下最新的版本。

如何修改依赖包内的代码

有时候,我们import了一个依赖包,但是需要修改其中的代码,怎么办呢?

  • 1)最简单的方法: 在 go.mod 文件最后加上replace
# 替换成本地路径
replace github.com/maelvls/beers => ../beers # 替换成 github 路径
replace github.com/facebookincubator/ent v0.0.1 => github.com/mine/ent v0.0.1
  • 2)使用vendor

使用 go mod vendor + go build -mod=vendor命令,这会强制 go 使用 vendor/ 目录下的文件,而不是$GOPATH/pkg/mod下的。

这俩命令,也可以帮助你的 vim 和 VSCode 解决找不到 某个指定版本的包的问题,毕竟现在所有的依赖包都在 /vendor 目录下了。

如何使用私有库的 pkg

大家在公司一般使用 Gitlab/Github 上的私有代码库。Go 1.13之后,使用GOPRIVATE变量,我们可以跳过包代理,更快捷地获取私有库代码。

# 也可以在 .gitconfig 文件中加上相应配置
git config --global url."https://foo:${GITHUB_TOKEN}@github.com/company".insteadOf "https://github.com/company" export GOPRIVATE=github.com/company/\*

参考链接:

Go 包管理中的常见问题的更多相关文章

  1. 在python包管理中使用easy_install软件的步骤

    本文主要介绍的是让python包管理变得更加容易的实际应用方法,就是运用easy_install这一软件,下面是文章的具体介绍. easy_install让python包管理变得 如果你想对Pytho ...

  2. CentOS配置本地光盘yum源

    在实际使用linux的过程中,会经常出现安装的发行版有的软件包没有安装的情况,这时,就需要用户从如下两种操作中做出选择:1.手动安装rpm包.2.用yum命令安装软件包. 选择1手动安装的时候经常会遇 ...

  3. Windows中一个22年的漏洞

     X Windows系统,今天作为世界各地的Linux桌面,已经存在超过20年了,仍然存在Bug.几天前Sysadmins为libXfont库提供了补丁,来对应新发现的已经在代码中存在了22年的特权升 ...

  4. WebRTC for UWP

    首先还是简单的介绍下webRTC吧: WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2 ...

  5. NET笔记——IOC详解和Unity基础使用介绍

    说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己. IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转 ...

  6. php composer包管理工具

    一 . 包管理工具 你在Centos上装工具的时候直接yum -y install xx 比你去rpm -ivh xx.rpm 是不是爽很多呢? composer 就是安装php 代码的一个类似工具. ...

  7. Windows 多用户远程访问 Ubuntu 14.04桌面

    使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...

  8. C#中四步轻松使用log4net记录本地日志

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  9. python打包工具distutils、setuptools分析

    在上一篇博文中总结了python中导入包,安装包一条完整的线路.其中有一个有意思的知识点,安装包的方式有很多种,模块和包管理中打包,发布,安装也是值得研究的内容. python中安装包的方式有很多种: ...

随机推荐

  1. 写给MongoDB开发者的50条建议Tip21

    本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...

  2. 06 __init__ 和 __new__的关系和不同

    一. 双下new 和 双下init 关系 首先从__new__(cls,a,b,c)的参数说说起,__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化 ...

  3. rabbitmq启动时出错epmd error for host

    centos7环境下新装rabbitmq,第一次启动时发现出错:ERROR: epmd error for host "****":XXXXXXX 检查发现当前机器的名称为 1  ...

  4. JavaWeb----Servler

    Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类, ...

  5. 【Hadoop离线基础总结】Hadoop的架构模型

    Hadoop的架构模型 1.x的版本架构模型介绍 架构图 HDFS分布式文件存储系统(典型的主从架构) NameNode:集群当中的主节点,主要用于维护集群当中的元数据信息,以及接受用户的请求,处理用 ...

  6. 自定义IDOC

    目录 1需求场景    4 2配置发送端IDOC    4 2.1定义段(WE31)    4 2.2定义基本类型(WE30)    4 2.3定义消息类型(WE81)    5 2.4定义传输结构  ...

  7. Linux内核驱动学习(七)应用层直接操作GPIO

    文章目录 简介 原理图 节点 设置为输出 设置为输入 映射关系 debugfs pwm demo 简介 前面通过libgpio的方式介绍了内核空间对GPIO进行操作的接口,其做了较好的封装,同时Lin ...

  8. 新创建的项目AndroidManifast报App is not indexable by Google Search;

    原错误提示:App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VI ...

  9. docker磁盘空间不足解决办法

    docker磁盘空间不足解决办法 导入docker镜像时,错误提示:磁盘空间不足. 1.查看docker镜像存放目录空间大小 du -hs /var/lib/docker/ 2.停止docker服务. ...

  10. JDBC12 ORM01 Object[]存放一条记录

    ORM(Object Relationship Mapping)的基本思想 -表结构跟类对应:表中的字段和类的属性对应:表中记录和对象对应 让JavaBean的属性名和类型尽量和数据库保持一致 一条记 ...