Golang 从gopath到 go modules

一 前言

Golang是最近新学的语言。偶尔使用一下。属实好用。golang默认使用gopath来管理jar包、

gopath 有一个很严重的问题。 当你本地开多个项目的时候,没法让不同项目对应不同的jar包版本。这样很蛋疼的。如果引入的jar版本是不向下兼容的话,那开发的时候都可能会出现很多问题。比如我的jar有这个方法。你的没有。很难玩的。

像java的maven是配置jar版本在pom.xml中、而go也有这么个包管理工具  modules

二 Gopath

先写一下gopath的用法吧。先看一下 go  env 展示的go的变量值。

Golang 从gopath到 go modules_第1张图片

其中 goRoot 是你go的SDK安装路径。go的默认包存放在这个目录的src下。go的执行命令在 bin 目录下。

只需将GoPath的位置配置在环境变量中就可以了。

你在程序中import导的包  通过  go get 就会下载到gopath中。gopath可以设置多个、按顺序查找jar包。先找GoRoot,然后按照goPath的顺序找、都没有not found  然后你再下就可以了。

Golang 从gopath到 go modules_第2张图片

Gopath会将包文件下载到你配置的GOPATH环境变量的src文件夹下。

Golang 从gopath到 go modules_第3张图片

经常会遇到一种情况就是某个jar包被墙了。网络不通下载不了。一般都会在GitHub中有该jar资源的、

比如  golang.org/x/net  这个go  get 如果没有代理就会被墙。 取而代之:github.com/golang/net

goPath在我目前的使用大概就是这么用的。它没法区分版本。如果你变更版本就只能重新下载。然后将jar的原来位置覆盖掉、或者如果在github中下的。可以通过 tag  或者  branch 切换一下jar的版本。非常的麻烦。

三 go mod

go mod  推荐 1.12版本及以后使用。据说1.11不太稳定有一些问题。

使用go mod 的第一步是设置开启go modules 和设置代理
添加环境变量  
GO111MODULE = on       开启之后。go get/ go mod download 等命令会下载到$GoPath/pkg目录下的mod文件夹中。
GOPROXY = https://goproxy.cn   设置一个代理  七牛云的CDN

go mod init projectName 来将项目初始化为mod管理的项目。 或者在goland这种编辑器的 Go--modules设置一下代理。然后会自动下。
或者直接run  或者执行 go mod download/tidy 也会下载。

Golang 从gopath到 go modules_第4张图片

然后 $gopath/pkg下面就有了

Golang 从gopath到 go modules_第5张图片

go module 拉取package的原则是先拉取最新的release tag 若无tag 则拉取最新的commit

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

go get package@version  可以升级包 对应的 go.mod/go.sum文件也会被修改。
例如执行 go get github.com/mattn/[email protected] 

可以在go.mod中使用replace代替被墙的包----指向可以下到的包地址。  如下

replace (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)

go mod 一共有四种指令。
module 模块名称  require 依赖包及版本  exclude 禁止的依赖包及其版本  replace 替换的依赖包列表 

这个module  模块名称是import时需要写的。 对于不同的版本 在git库中我们可以改完一版之后提一个tag并修改对应的module重写提tag

go mod edit -require="github.com/golang/[email protected]"  主动修改mod的引用包版本。

go mod tidy  拉取缺少的模块。移除不用的模块。  这个神技 非常好用  go mod tidy -v  可以把没引用到的剔除。

go.sum不是锁文件。  是对包版本的一个校验文件。

go mod graph 列出所有的包依赖关系、


go list -m all    列出当前模块依赖的所有模块
go list -u -m all    列出当前模块依赖中可升级的模块
go get -u    升级所有依赖至最新版本
go get -u=patch    升级所有依赖至最新的修订版本
go mod tidy    清理未使用/生效的依赖
 

以上就是go  modules 的一些用法。使用起来非常简单。不过没找到包的时候需要go.mod写一下  replace 相比maven就不方便了。但是与gopath和其他go的包管理比起来这个更是首推的。学这个没错的、

 

参考:

https://segmentfault.com/a/1190000018536993    

https://objcoding.com/2018/09/13/go-modules/

https://xuanwo.io/2019/05/27/go-modules/

你可能感兴趣的:(go)