• Gomodule和GoPath


    GoLang生态系统

    什么是GOROOT

    GOROOT 是环境变量,它的值是 Golang 安装包路径

    什么是GOPATH

    GOPATH 是Golang 1.5版本之前一个重要的环境变量配置,是存放 Golang 项目代码的文件路径。

    可以通过go env命令查看

    image-20221130104347515

    GOPATH目录

    进入GOPATH目录,查看该目录下的所有文件。

    go
    ├── bin
    ├── pkg
    └── src
        ├── github.com
        ├── golang.org
        ├── google.golang.org
        ....
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到有三个文件夹。

    • bin 存放编译生成的二进制文件。比如 执行命令 go get github.com/google/gops,bin目录会生成 gops 的二进制文件。

    • pkg 其中pkg下面以下三个文件夹。

      • ​ XX_amd64: 其中 XX 是目标操作系统,比如 mac 系统对应的是darwin_amd64, linux 系统对应的是 linux_amd64,存放的是.a结尾的文件。
      • ​ mod: 当开启go Modules 模式下,go get命令缓存下依赖包存放的位置
      • ​ sumdb: go get命令缓存下载的checksum数据存放的位置

    image-20221130110609452

    GOPATH缺点
    • go get 命令的时候,无法指定获取的版本

    • 引用第三方项目的时候,无法处理v1、v2、v3等不同版本的引用问题,因为在GOPATH 模式下项目路径都是 github.com/foo/project

    • 无法同步一致第三方版本号,在运行 Go 应用程序的时候,无法保证其它人与所期望依赖的第三方库是相同的版本。

    变量名变量值
    GOROOTC:\Program\Go(这里填写你的Golang安装目录)
    GOPATHC:\Program\Go\WrokSpace(这里填写你的Golang工作目录,用于保存相应下载的包,例如go get -u github.com/go-sql-driver/mysql)

    什么是GOMODULE

    gomodule诞生是为了实现存放项目路径自由和不同版本的管理。

    image-20221130105929563

    GO111MODULE的行为

    在go 1.11 官方出手了推出了 Go Modules, 通过设置环境变量 GO111MODULE 进行开启或者关闭 go mod 模式。

    • auto 自动模式,当项目根目录有 go.mod 文件,启用 Go modules
    • off 关闭 go mod 模式
    • on 开启go mod 模式

    到目前为止,GO111MODULE为每个 Go 操作明确设置了环境变量。无变量集,缺省值GO111MODULEauto,它的行为如下:

    image-20221130111019304

    通过命令,关闭go module,切换到GOPATH模式

    go env -w GO111MODULE=off
    
    • 1

    然后再执行go get命令,就会把源代码下载到GOPATH所在的目录下

    go get -u github.com/jinzhu/gorm
    
    • 1

    image-20221130110358581

    Go mod命令
    命令作用
    go mod init 工程名(一般和根文件夹的名字一样)生成 go.mod 文件,一个go mod工程一个go.mod文件, 并且一定要在工程的根目录
    go mod download下载 go.mod 文件中指明的所有依赖
    go mod tidy整理现有的依赖
    go mod graph查看现有的依赖结构
    go mod edit编辑 go.mod 文件
    go mod vendor导出项目所有的依赖到vendor目录
    go mod verify校验一个模块是否被篡改过
    go mod why查看为什么需要依赖某模块
    初始化Modules

    新创建一个空目录test_mod,进入该目录,执行命令

    //test_mod 为项目名称
    go mod int test_mod
    
    • 1
    • 2

    会在根目录生成一个 go.mod 文件,内容如下:

    module test_mod
    
    go 1.17
    
    • 1
    • 2
    • 3

    如果想引入第三方网络包,在该项目目录执行 go get 仓库地址。比如引入定时任务:

    go get github.com/robfig/cron/v3
    
    • 1

    go.mod 会变成为, indirect 代表是间接依赖,因为当前项目是空的,所以并没有发现这个模块的明确引用。

    module test_mod
    
    go 1.17
    
    require github.com/robfig/cron/v3 v3.0.1 // indirect
    
    • 1
    • 2
    • 3
    • 4
    • 5

    并且也会新增一个go.sum文件, 它的作用是保证项目所依赖的模块版本,不会被篡改。

    github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
    github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
    
    • 1
    • 2

    注意此时,我们的项目是没有任何go代码文件的,现在只有 go.mod 和 go.sum 两个文件。

    如果我们 go.mod 导入了第三方包,但项目代码中我不用,就是玩。领导发现后,不小心一个 go mod tidy 命令,直接把你回到解放前。

    观察 go.mod 会发现已经没有了这串神秘代码

    require github.com/robfig/cron/v3 v3.0.1 // indirect
    
    • 1

    机智的你,可能已经猜到了,go mod tidy 就是去掉go.mod文件中项目不需要的依赖。

    image-20221130112059714

    什么是GOPROXY

    作为开发者基本上都会用到 github 上面的开源仓库,因网络问题,导致有些包是无法下载下来的。不过不用担心,太阳底下无新鲜事,已经现成的Go 镜像站点帮你获取。

    环境变量 GOPROXY 就是设置 Go 模块代理的,其作用直接通过镜像站点来快速拉取所需项目代码。

    常见代理配置

    执行命令:

    go env -w GOPROXY="https://goproxy.cn,direct" 
    
    • 1

    SIV rules

    Go MODULE引入了SIV来支持多个项目版本的依赖关系管理。它有三个规则:

    (1) Golang项目应该遵循语义版本控制格式(Semver)。图2(a)给出了一个示例,其中projectA在GitHub上使用v2.7.0的语义版本标记了一个版本。

    (2)当一个项目的主要版本是v2或以上版本(表示为v2+)时,必须在go.mod文件中声明的模块路径的末尾包含像“/v2”这样的版本后缀。如图2(b)所示,projectAv2.7.0的模块路径为“github.com/user/projectA/v2”。要引用它,下游项目必须声明此路径,并在go.mod文件的需要指令属性中,以及在其.go源文件的导入指令属性中导入它。图2©和(d)给出了两个例子。

    (3)如果一个项目的主要版本是v0/v1,则其版本后缀不应该包含在其模块或导入路径中。 如果不写/v2 默认就是/v0或/v1。

    image-20221130145629520

    image-20221130145354397

    在Go模块中的这些SIV规则下,一个库的多个主要版本可以被不同的路径单独引用。相比之下,GOPATH中的一个项目只能引用一个库的最新版本。

    引用

    https://blog.csdn.net/luosisan/article/details/124062564

    https://blog.csdn.net/asdcls/article/details/121654725

  • 相关阅读:
    听音乐赚钱App,每天听歌收益5美金,保姆级教学,被动收入人人可做
    3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?
    如何才能去Salesforce原厂工作?
    Power Apps-库组件样式调整
    【小程序】-(小撒)
    gRPC 自定义负载均衡算法
    货物从内地到香港的选择
    MySQL中的datetime和timestamp有什么区别
    「Verilog学习笔记」优先编码器Ⅰ
    如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中
  • 原文地址:https://blog.csdn.net/matafeiyanll/article/details/128150771