Go语言笔记----GoMoudle

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言笔记----GoMoudle相关的知识,希望对你有一定的参考价值。

Go语言笔记----GoMoudle


Go Path模式

GOPATH可以将其理解为工作目录,在这个工作目录下,通常有如下的目录结构


每个目录存放的文件,都不相同

  • bin:存放编译后生成的二进制可执行文件
  • pkg:存放编译后生成的 .a 文件
  • src:存放项目的源代码,可以是你自己写的代码,也可以是你 go get 下载的包

将你的包或者别人的包全部放在 $GOPATH/src 目录下进行管理的方式,我们称之为 GOPATH 模式。


gopath缺陷

  • ⽆版本控制概念
  • ⽆法同步⼀致第三⽅版本号
  • ⽆法指定当前项⽬引⽤的第三⽅版本号

GoMoudle

Go mod命令

  • go mod init ⽣成 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 查看为什么需要依赖某模块

go mod环境变量

  • GO111MODULE
    • 是否开启go modules模式
    • 建议go V1.11之后,都设置为on

可以通过下面的命令来设置:

go env -w GO111MODULE=on
  • GOPROXY
    • 项⽬的第三⽅依赖库的下载源地址
    • 建议设置国内的地址
      • 阿⾥云 https://mirrors.aliyun.com/goproxy/
      • 七⽜云 https://goproxy.cn,direct
    • direct
      • ⽤于指示 Go 回源到模块版本的源地址去抓取(⽐如 GitHub 等)
  • GOSUMDB
    • ⽤来校验拉取的第三⽅库是否是完整的
    • 默认也是国外的⽹站,如果设置了GOPROXY,这个就不⽤设置了
  • GONOPROXY : 通过设置GOPRIVATE即可
  • GONOSUMDB: 通过设置GOPRIVATE即可
  • GOPRIVATE: 通过设置GOPRIVATE即可
    • go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx
    • 表示git.example.com 和 github.com/aceld/zinx是私有仓库,不会进⾏GOPROXY下载和校验
    • go evn -w GOPRIVATE=“*.example.com”
    • 表示所有模块路径为example.com的⼦域名,⽐如git.example.com 或者 hello.example.com 都不进⾏GOPROXY下载和校验

通过 go env来查看环境变量

如何设置环境变量呢?

  • go env -w GO111MODULE=on
  • 或者通过 Linux export 环境⽅式也可以

使⽤Go Modules初始化项⽬

1 开启Go Modules模块

  • 保证GO111MODULE=on
    • go env -w GO111MODULE=on
    • export GO111MODULE=on
      • 设置在⽤户启动脚本中
      • 需要重新打开终端或者执⾏source ~/.bashrc

2 初始化项⽬

  • 任意⽂件夹创建⼀个项⽬(不要求在$GOPATH/src) mkdir -p $HOME/aceld/modules_test
  • 创建go.mod⽂件,同时起当前项⽬的模块名称 go mod init github.com/aceld/module_test
  • 就会⽣成⼀个go mod⽂件

  • 在该项⽬编写源代码
    • 如果源代码中依赖某个库(⽐如: github.com/aceld/zinx/znet)
    • ⼿动down go get github.com/aceld/zinx/znet
    • ⾃动down
module dhy/goTest

go 1.18

require github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 // indirect
  • 含义当前模块依赖github.com/aceld/zinx
  • 依赖的版本是 v0.0.0-20200315073925-f09df55dc746
  • //indirect 表示间接依赖
  • 因为项⽬直接依赖的是znet包
  • 所以所间接依赖zinx包
  • 会⽣成⼀个go.sum⽂件
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 h1:TturbcEfboY81jsKVSQtGkqk8FN8ag0TmKYzaFHflmQ=
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746/go.mod h1:bMiERrPdR8FzpBOo86nhWWmeHJ1cCaqVvWKCGcDVJ5M=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
  • go.sum⽂件的作⽤ 罗列当前项⽬直接或间接的依赖所有模块版本,保证今后项⽬依赖的版本不会被篡改
  • h1:hash 表示整体项⽬的zip⽂件打开之后的全部⽂件的校验和来⽣成的hash,如果不存在,可能表示依赖的库可能⽤不上,xxx/go.mod h1:hash go.mod⽂件做的hash

修改指定版本模块的依赖关系

我们可以对导包的请求路径进行重定向,通过replace完成:

//-replace=旧依赖版本=新依赖版本
go mod edit -replace=zinx@v0.0.0-20200306023939bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100

go mod⽂件就会被修改

module github.com/aceld/modules_test
go 1.14
require github.com/aceld/zinx v0.0.0-20200306023939-bc416543ae24 // indirect
//当寻找到github.com/aceld/zinx v0.0.0-20200306023939-bc416543ae24依赖时,会自动重定向到zinx v0.0.0-20200221135252-8a8954e75100
replace zinx v0.0.0-20200306023939-bc416543ae24 => zinx v0.0.0-20200221135252-8a8954e75100

参考文章

何处安放我们的 Go 代码

Go Modules 终极入门

以上是关于Go语言笔记----GoMoudle的主要内容,如果未能解决你的问题,请参考以下文章

golang学习路径04包管理依赖管理GoMoudle

《Go语言精进之路》读书笔记 | 汇总

《Go语言精进之路》读书笔记 | 理解Go语言的设计哲学

《go语言高级编程》笔记

《Go语言精进之路》读书笔记 | 理解Go语言的包导入

《Go语言精进之路》读书笔记 | 选择适当的Go语言版本