Golang是最近新学的语言。偶尔使用一下。属实好用。golang默认使用gopath来管理jar包、
gopath 有一个很严重的问题。 当你本地开多个项目的时候,没法让不同项目对应不同的jar包版本。这样很蛋疼的。如果引入的jar版本是不向下兼容的话,那开发的时候都可能会出现很多问题。比如我的jar有这个方法。你的没有。很难玩的。
像java的maven是配置jar版本在pom.xml中、而go也有这么个包管理工具 modules
先写一下gopath的用法吧。先看一下 go env 展示的go的变量值。
其中 goRoot 是你go的SDK安装路径。go的默认包存放在这个目录的src下。go的执行命令在 bin 目录下。
只需将GoPath的位置配置在环境变量中就可以了。
你在程序中import导的包 通过 go get 就会下载到gopath中。gopath可以设置多个、按顺序查找jar包。先找GoRoot,然后按照goPath的顺序找、都没有not found 然后你再下就可以了。
Gopath会将包文件下载到你配置的GOPATH环境变量的src文件夹下。
经常会遇到一种情况就是某个jar包被墙了。网络不通下载不了。一般都会在GitHub中有该jar资源的、
比如 golang.org/x/net 这个go get 如果没有代理就会被墙。 取而代之:github.com/golang/net
goPath在我目前的使用大概就是这么用的。它没法区分版本。如果你变更版本就只能重新下载。然后将jar的原来位置覆盖掉、或者如果在github中下的。可以通过 tag 或者 branch 切换一下jar的版本。非常的麻烦。
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 也会下载。
然后 $gopath/pkg下面就有了
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/