go1.17+中的GOPATH
虽然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相关推荐
- Go1.17 这个新特性竟是 6 年前提出来的
作者 | 站长polaris 责编 | 欧阳姝黎 Go1.17 预计在 8 月份发布.目前 tip.golang.org 可以浏览 Go1.17 的相关内容,https://tip.gol ...
- Go1.17 快报之标准库越来越注重易用性
阅读本文大概需要 5 分钟. 大家好,我是 polarisxu. 说起 Go 的优点,很多人会提到 Go 拥有强大的标准库,比如开发一个 HTTP 服务,几行代码就搞定.不过,如果是一个 PHPer ...
- Go1.17新特性 ,给我们带来了10%的性能提升
在 Go1.17 发布后,我们惊喜的发现 Go 语言他又又又优化了,编译器改进后产生了约 5% 的性能提升,也没有什么破坏性修改,保证了向前兼容. img 他做了些什么呢,好像没怎么看到有人提起.为此 ...
- goland 2021.2 配置go( go1.17.6)
一,配置settings: 1,打开配置界面: file->settings->Go 如图: 2,配置GOROOT,如图: 3,配置GOPATH,如图:无需配置: 4,Go Modules ...
- C++17中那些值得关注的特性(上)
C++17标准在2017上半年已经讨论确定,正在形成ISO标准文档,今年晚些时候会正式发布.本文将介绍最新标准中值得开发者关注的新特新和基本用法. 总的来说C++17相比C++11的新特性来说新特性不 ...
- ssms的导入功能_SSMS 17中的新增功能; PowerShell和DAX
ssms的导入功能 介绍 (Introduction) In earlier versions, SSMS was included in the SQL Server installer. Now ...
- JDK 17:Java 17 中的新特性
始终严格的浮点语义.外部函数和内存 API 以及伪随机数生成器的统一 API 计划用于 9 月发布的 Java 长期支持版本. Java 17 的功能集现已冻结,标准 Java 的下一版本将拥有 10 ...
- win10中配置gopath环境变量遇到的问题
win10中配置gopath环境变量遇到的问题 在配置好变量编译go文件时,出现go: GOPATH entry is relative; must be absolute path: "\ ...
- kodi linux版本,如何在 Ubuntu 14.04 和 Linux Mint 17 中安装 Kodi14(XBMC)
Kodi,原名就是大名鼎鼎的XBMC,发布了开发代号为Helix的最新版本14.感谢官方XMBC提供的PPA,现在可以很简单地在Ubuntu 14.04中安装了. 有些人可能还不了解Kodi,它是一个 ...
最新文章
- Zabbix配置详解
- java 二维高斯_Java Random nextGaussian()用法及代码示例
- Python is 和 == 区别 - Python零基础入门教程
- linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建
- ubuntu18重启vncserver_一看必会系列:ubuntu 18.10 安装vncserver
- 弱引用WeakReference
- git add/commit/pull之间的关系
- java与js的split方法
- mme设备内部错误_低压配电设备常见故障分析,处理办法介绍
- apache url 包含特殊字符 404
- 像素px与厘米怎么换算
- 思岚A1激光雷达的测试(windows)
- rabbitmq版本升级
- 出租分数 20作者 陈越单位 浙江大学
- python:函数基础(1)
- css3绝对定位垂直居中,CSS3绝对定位自适应居中 - 米扑博客
- html语言中空一行,用html代码如何打出心型(中空)符号?
- 射频信号源进阶使用技巧【转载自微信公众号微波射频网】
- HDMI转DP带5V供电转接线方案|HDMI转EDP点屏转换方案|CS5801最新电路设计原理图
- URP - Render feature实现镜面反射