虽然golang已经从1.17废弃了gopath的包管理方式,但目前gopath是对ide最友好的,vendor也可以,但会造成本地磁盘代码膨胀,以现在流行的微服务架构,动辄上百个项目,磁盘受不了。

通过 GO111MODULE="off" 启用gopath。

GOPATH 环境变量可以设置多个目录,比如共享的gopath和本项目自身的根目录(/myroot/src/mydomain/myproject/*中的myroot),当go get时使用第一个目录存放拉取的包。

当 GOPATH 包含多个目录时,在windows下和linux下目录列表分隔符是不同的,如下:

linux:

const (PathSeparator     = '/' // OS-specific path separatorPathListSeparator = ':' // OS-specific path list separator
)

windows:

const (PathSeparator     = '\\' // OS-specific path separatorPathListSeparator = ';'  // OS-specific path list separator
)

对import中大版本的支持:

GO111MODULE="off" 时,如源码引入了:import "github.com/go-acme/lego/v3/acme",

通过 go get github.com/go-acme/lego/v3/acme 只能下载最新版本的包,并不能自动切到v3下。

只能通过两种方式解决:

1、到lego目录下手动切到v3下,如:git checkout v3.9.0

缺点:没办法处理版本冲突,如果存在一个代码库多个 /vN 的大版本依赖,只能通过下面的方式解决:

2、将lego目录更名为v3,并在v3前面新增lego目录,然后到v3目录下手动切到v3.9.0的tag下。

是否启用 GO111MODULE 对go get命令的版本格式也有影响,甚至诡异,以go1.18为例:

一、当 GO111MODULE = off 时,下载存放目录是gopath/src/,版本表示如下:

当使用 go get example.com/pkg 时,下载的是最新版。

当使用 go get example.com/pkg/v2.1.0 时,下载的仍然是最新版,指定的tag无效。

当使用 go get example.com/pkg@v2.1.0 时,报语法错误。

二、当 GO111MODULE = on 时,下载存放目录是gopath/pkg/mod/,版本表示如下:

2.1 当要下载的目标包在 go.mod 文件中未指定大版本时:

当使用 go get example.com/pkg 时,下载的是最新版。

当使用 go get example.com/pkg/v2 时,大版本不生效,下载的是最新tag。

当使用 go get example.com/pkg/v2@v2.1.0 时,大版本不生效,下载的是指定tag v2.1.0。

当使用 go get example.com/pkg@v2.1.0 时,下载很顺滑,下载的是指定tag v2.1.0。

2.2 当要下载的目标包在 go.mod 文件中通过 module example.com/pkg/v2 指定大版本时:

当使用 go get example.com/pkg 时,下载的也许是本地也许是远程代理的缓存版本,未必是最新版。

当使用 go get example.com/pkg/v2 时,下载的是v2大版本下的最新tag。

当使用 go get example.com/pkg/v2@v2.1.0 时,下载的是v2大版本下的指定tag v2.1.0。

当使用 go get example.com/pkg@v2.1.0 时,报错invalid version,也就是tag需要放到大版本下。

观察 GOPROXY 的代理是否生效:

go get -x example.com/pkg

将gopath目录中的依赖移到项目vendor目录下:

可以通过govendor工具解决,github.com/kardianos/govendor 已经停止更新,但是还可以使用。

一、安装govendor:

go install github.com/kardianos/govendor

二、初始化vendor目录:

GO111MODULE="off" GOPATH=/my_gopath:/project_root govendor init

三、将gopath依赖移到vendor:

GO111MODULE="off" GOPATH=/my_gopath:/project_root govendor add +e

此命令会全量扫描项目代码和项目依赖的代码,找出所有依赖,然后复制到vendor目录下,很耗时。

缺点:govendor 不能识别go.mod中的大版本标识,所以对于类似 github.com/go-acme/lego/v3/acme 的依赖会提示找不到,只有依赖包名和gopath路径完全一致时才能工作。

四、基于vendor目录编译项目:

GO111MODULE="off" GOPATH=/project_root go build main.go

在vscode中启用老式的gopath支持:

1、修改项目的环境变量:

打开workspace里的go插件配置,如下图,然后点击edit in settings.json

在settings.json里添加环境变量如下:

{"go.toolsEnvVars": {"GO111MODULE" : "off"},"go.inferGopath": true
}

2、打开go插件的根据项目root推断gopath设置:

vscode会自动在settings.json里添加一行:"go.inferGopath": true

go1.17+中的GOPATH相关推荐

  1. Go1.17 这个新特性竟是 6 年前提出来的

    作者 | 站长polaris       责编 | 欧阳姝黎 Go1.17 预计在 8 月份发布.目前 tip.golang.org 可以浏览 Go1.17 的相关内容,https://tip.gol ...

  2. Go1.17 快报之标准库越来越注重易用性

    阅读本文大概需要 5 分钟. 大家好,我是 polarisxu. 说起 Go 的优点,很多人会提到 Go 拥有强大的标准库,比如开发一个 HTTP 服务,几行代码就搞定.不过,如果是一个 PHPer ...

  3. Go1.17新特性 ,给我们带来了10%的性能提升

    在 Go1.17 发布后,我们惊喜的发现 Go 语言他又又又优化了,编译器改进后产生了约 5% 的性能提升,也没有什么破坏性修改,保证了向前兼容. img 他做了些什么呢,好像没怎么看到有人提起.为此 ...

  4. goland 2021.2 配置go( go1.17.6)

    一,配置settings: 1,打开配置界面: file->settings->Go 如图: 2,配置GOROOT,如图: 3,配置GOPATH,如图:无需配置: 4,Go Modules ...

  5. C++17中那些值得关注的特性(上)

    C++17标准在2017上半年已经讨论确定,正在形成ISO标准文档,今年晚些时候会正式发布.本文将介绍最新标准中值得开发者关注的新特新和基本用法. 总的来说C++17相比C++11的新特性来说新特性不 ...

  6. ssms的导入功能_SSMS 17中的新增功能; PowerShell和DAX

    ssms的导入功能 介绍 (Introduction) In earlier versions, SSMS was included in the SQL Server installer. Now ...

  7. JDK 17:Java 17 中的新特性

    始终严格的浮点语义.外部函数和内存 API 以及伪随机数生成器的统一 API 计划用于 9 月发布的 Java 长期支持版本. Java 17 的功能集现已冻结,标准 Java 的下一版本将拥有 10 ...

  8. win10中配置gopath环境变量遇到的问题

    win10中配置gopath环境变量遇到的问题 在配置好变量编译go文件时,出现go: GOPATH entry is relative; must be absolute path: "\ ...

  9. kodi linux版本,如何在 Ubuntu 14.04 和 Linux Mint 17 中安装 Kodi14(XBMC)

    Kodi,原名就是大名鼎鼎的XBMC,发布了开发代号为Helix的最新版本14.感谢官方XMBC提供的PPA,现在可以很简单地在Ubuntu 14.04中安装了. 有些人可能还不了解Kodi,它是一个 ...

最新文章

  1. Zabbix配置详解
  2. java 二维高斯_Java Random nextGaussian()用法及代码示例
  3. Python is 和 == 区别 - Python零基础入门教程
  4. linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建
  5. ubuntu18重启vncserver_一看必会系列:ubuntu 18.10 安装vncserver
  6. 弱引用WeakReference
  7. git add/commit/pull之间的关系
  8. java与js的split方法
  9. mme设备内部错误_低压配电设备常见故障分析,处理办法介绍
  10. apache url 包含特殊字符 404
  11. 像素px与厘米怎么换算
  12. 思岚A1激光雷达的测试(windows)
  13. rabbitmq版本升级
  14. 出租分数 20作者 陈越单位 浙江大学
  15. python:函数基础(1)
  16. css3绝对定位垂直居中,CSS3绝对定位自适应居中 - 米扑博客
  17. html语言中空一行,用html代码如何打出心型(中空)符号?
  18. 射频信号源进阶使用技巧【转载自微信公众号微波射频网】
  19. HDMI转DP带5V供电转接线方案|HDMI转EDP点屏转换方案|CS5801最新电路设计原理图
  20. URP - Render feature实现镜面反射

热门文章

  1. js通过字节长度截取中英文混合字符串
  2. 阿里新零售中的智能补货(I)— 库存模型
  3. pip install psycopg2报错
  4. android碎片实验报告,三年级下册科学实验报告模板1篇
  5. 使用zxing 解析图片中的二维码
  6. kohana php版本,kohana框架的入门学习 2.0版本的
  7. SpringMVC基础入门
  8. Android 友盟统计 友盟推送 友盟分享快速集成
  9. vue 中使用 marked + highlight.js 代码高亮
  10. 软件工程--面向对象的分析和设计方法