【Go】Go moudle、Go 环境变量、import path XXX should not have @version问题解决

import path XXX should not have @version

PS D:\IDES\GoLand_workspace\src\Graduation_project\echomap> go mod tidy
go: echomap/pkg/mod/github.com/!azure/go-ntlmssp@v0.0.0-20221128193559-754e69321358: import path "echomap/pkg/mod/github.com/!azure/go-ntlmssp@v0.0.0-20221128193559-754e69321358" should not have @version
go: echomap/pkg/mod/github.com/aymerick/douceur@v0.2.0: import path "echomap/pkg/mod/github.com/aymerick/douceur@v0.2.0" should not have @version
go: echomap/pkg/mod/github.com/aymerick/douceur@v0.2.0/css: import path "echomap/pkg/mod/github.com/aymerick/douceur@v0.2.0/css" should not have @version

删除pkg目录

在这里插入图片描述

go clean -modcache
go mod tidy

Go Path

GOPath是指Go代码文件在文件系统上的位置。在Go 1.8之前的版本中,Go使用GOPATH环境变量来指定工作区(workspace)的路径,所有的Go代码都需要放置在GOPATH下。
通过go install命令安装的包会放置在GOPATH的bin目录下。

Go 环境变量

$GOROOT 表示 Go 的安装目录,它的值一般都是 H O M E / g o ,当然也可以安装在别的地方。 ‘ HOME/go,当然也可以安装在别的地方。 ` HOME/go,当然也可以安装在别的地方。GOARCH表示目标机器(目标机器是指你打算运行你的 Go 应用程序的机器。)的处理器架构,它的值可以是 386、amd64 或 arm。 G O O S ‘ 表示目标机器的操作系统,它的值可以是 d a r w i n 、 f r e e b s d 、 l i n u x 或 w i n d o w s 。 ‘ GOOS` 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。 ` GOOS表示目标机器的操作系统,它的值可以是darwinfreebsdlinuxwindowsGOBIN` 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默认值。

Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性(操作系统与处理器架构)。
为了区分本地机器和目标机器,可以使用 $GOHOSTOS 和 $GOHOSTARCH 设置本地机器的操作系统名称和编译体系结构,这两个变量只有在进行交叉编译的时候才会用到,如果你不进行显示设置,他们的值会和本地机器($GOOS 和 $GOARCH)一样。

$GOPATH (重点)默认采用和 $GOROOT 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。
它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。

$GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
$GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数

GO111MODULE(重点):
GO111MODULE有三个值:off, on和auto(默认值)。
1、GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。(vendor目录是一个特殊的目录,它用于存放项目的所有依赖包的副本。这个目录是在Go Modules引入后出现的,其目的是为了确保项目的构建依赖是确定的,不受外部环境的影响。)
2、GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
3、GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:(1)当前目录在GOPATH/src之外且该目录包含go.mod文件(2)当前文件在包含go.mod文件的目录下面。

D:\>go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
go: stripping unprintable or unescapable characters from %"GOCACHE"%
set GOCACHE=C:\Users\AppData\Local\go-build
go: stripping unprintable or unescapable characters from %"GOENV"%
set GOENV=C:\Users\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\IDES\GoLand_workspace\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\IDES\GoLand_workspace
set GOPRIVATE=
set GOPROXY=https://proxy.golang.com.cn,direct
set GOROOT=E:\Go
set GOSUMDB=
set GOTMPDIR=
set GOTOOLCHAIN=
set GOTOOLDIR=E:\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.22.1
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=0
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=C:\WINDOWS\TEMP\go-build758120991=/tmp/go-build -gno-record-gcc-switches

Go module和Go Path的关系

https://www.topgoer.com/%E5%85%B6%E4%BB%96/%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86.html

Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
module是一组包的集合,通常对应于一个项目或库。module可以包含多个包,这些包可以被其他项目或模块导入和使用。

随着Go模块的引入,Go语言的依赖管理和代码组织方式发生了变化。Go模块提供了一种新的、更灵活的方式来管理依赖,而不再依赖于GOPATH。这意味着开发者可以在任何地方编写Go代码,而不需要将其放置在GOPATH下。

在Go模块项目中,GOPATH的作用被大大减弱,GOPATH仍然可以作为模块的存放位置,但它不再是唯一的选择。在没有使用Go模块的情况下,GOPATH仍然是必需的,用于存放和组织代码。Go工具链的一些命令,如go get,仍然使用GOPATH来搜索和安装包。
总的来说,Go模块提供了一种更加现代化和灵活的方式来管理Go代码的依赖和版本,而GOPATH则逐渐转变为一个可选的代码组织方式。随着Go语言的发展,推荐开发者使用Go模块来管理项目依赖。

Go module

https://blog.csdn.net/weixin_39003229/article/details/97638573

go.mod其实就是一个Modules,关于Modules的官方定义为:
Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。
Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件

    go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
    go mod edit        编辑go.mod文件
    go mod graph       打印模块依赖图
    go mod init        初始化当前文件夹, 创建go.mod文件
    go mod tidy        增加缺少的module,删除无用的module
    go mod vendor      将依赖复制到vendor下
    go mod verify      校验依赖
    go mod why         解释为什么需要依赖

运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
运行go get -u=patch将会升级到最新的修订版本
运行go get package@version将会升级到指定的版本号version 如果下载所有依赖可以使用go mod download命令。

SET GOPROXY=https://goproxy.cn (这是win环境下的)
export GOPROXY=https://goproxy.cn (这是mac环境下的)

go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。

go.mod 文件内提供了module, require、replace和exclude四个关键字
module语句指定模块的名字(路径)
require语句指定的依赖项模块
replace语句可以替换依赖项模块
exclude语句可以忽略依赖项模块

1、依赖的包下载到哪里了?还在GOPATH/src里吗?
不在。
使用Go的包管理方式,依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。

2、可以把项目放在$GOPATH/src下吗?
可以。但是go会根据GO111MODULE的值而采取不同的处理方式,默认情况下,GO111MODULE=auto 自动模式
1.auto 自动模式下,项目在$GOPATH/src里会使用$GOPATH/src的依赖包,在$GOPATH/src外,就使用go.mod 里 require的包
2.on 开启模式,1.12后,无论在$GOPATH/src里还是在外面,都会使用go.mod 里 require的包
3.off 关闭模式,就是老规矩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值