package 管理顾名思义就是依赖管理,比如 java的maven,android的gradle,nodejs的npm,而go的package管理,可所谓一路很艰辛!在学习的时候,过时的管理方法可以暂不去学习,有时间再去学习
时间线:
go get
最初的 go get
- 解决的问题
依赖下载到 $GOPATH/src。 - 未解决的问题
国内有墙,下载慢甚至失败(虽然有gopm等国内镜像,但顶多算一个下载器,没有包管理的概念),没有版本控制,没有文件记录包的引用记录,只能设置多个GOPATH。
go1.5 vender
go 1.5 官方引入管理包依赖的方式,产生了很多官方与第三方的管理工具,如:
- govendor
- glide
- godep
- dep (golang官方推出)
评价
解决的问题:
将源码拷贝到当前工程的vendor目录下,这样打包当前的工程代码到任意机器的$GOPATH/src下都可以通过编译,避免项目代码外部依赖过多,迁移后,需要多次go get 外包依赖包;而且通过go get 重新拉去的外部依赖包的版本可能和工程开发时使用的不一致,导致编译错误问题。未解决的问题:
总的来说glide比较完善了。不过还是有些不太愉快的地方,如代码copy的泛滥,某个包在不同的项目中各有一份copy,而且其版本可能不一样;当依赖的包比较多的时候,vendor目录也会非常庞大。这是vendor的锅(或者说GOPATH的原罪,不能像maven一样对同一个包在本地有多个版本,本地只能有一份代码),似乎没办法避免。
无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包;只是在开发时,将其拷贝过来,但是一旦外部包升级,vendor下的代码不会跟着升级,而且vendor下面并没有元文件记录引用包的版本信息,这个引用外部包升级产生很大的问题,无法评估升级带来的风险;
go1.11 go module 推荐
评价
- 解决的问题:
多个项目可共用一个版本的依赖源码,防止依赖泛滥,支持锁,防止依赖源码删除与更新,支持下载源。目前最优秀的官方解决方案!