ipfs 的御用包管理器 gx 入门指南
何为 gx
官方称其为一个通用包管理器,构建于 IPFS 之上,gx 最初的设计灵感来自 nodejs 的 npm ,用来处理 golang 项目中的依赖包。如果从源码来欣赏 IPFS 并且心存二次开发的愿望,那么对 gx 的掌握还是非常有必要的。
安装 gx 包
$ gx init $ gx publish
忽略:Ignoring files from a publish
源码位置:
https://github.com/whyrusleeping/gx
创建和发布一个包:
import "gx/ipfs/QmYaVXmXZNpWs6owQ1rk5VAiwNinkTh2cYZuYx1JDSactL/go-lightrpc/rpcserver"
这个过滤后的树是前一个树的子集,而且仅显示出现在叶子节点上的 highlight 包
这里要顺便说一句,看过官方文档你会发现还有一个叫 gx-go 的工具,可以帮你自动把 gx 依赖导入 govendor 来管理,现在是动荡期,这个工具暂时就不推荐使用了,不出意外的话我们很快就要像送别 godeps 一样送别 govendor 了。
想要了解更多需要仔细阅读源码的 README,此处用来简要说明这个工具的使用方法,希望对使用 go-ipfs 和 go-libp2p 的同学能起到一些帮助的作用
工具要求
$ gx repo list myrepo events QmeJjwRaGJfx7j6LkPLjyPfzcD2UHHkKehDPkmizqSpcHT smalltree QmRgTZA6jGi49ipQxorkmC75d3pLe69N6MZBKfQaN6grGY stump QmebiJS1saSNEPAfr9AWoExvpfGoEK4QCtdLKCK4z6Qw7U
查看代码时你会发现工程中所有导入了 go-lightrpc 的地方都被替换了
依赖关系的设计原则
为了自动执行以上脚本,可以使用 release 子命令 gx release
将会自动帮你执行 version update 和 publish ,随后会执行你在 package.json 中通过 releaseCmd设置的指令,例如去获取你设置的 git commit -a -m \"gx publish $VERSION\",执行时 gx 会用 version 来覆盖 $VERSION 变量。 $ go get -u github.com/whyrusleeping/gx
如果没有启动 ipfs 那么 gx 会从 ipfs.io 这个公共网关获取资源,在国内这个网关几乎是不可用的。
其中 mypkg 指依赖包的 name ,可以在 package.json 中找到要更新的 mypkg ,也可以通过 gx deps 来找到对应的 mypkg.
其实gx update 还有一个很让人期待的选项 '--with-deps',顾名思义,他会帮助我们深度更新依赖的依赖 , 但遗憾的是这个功能尚不能达到生产级别,可以跟随gx每个版本的更新来体验其可用性,现在还是实验阶段。
也可以只提供要更新的包的 hash
列出本地已经添加的中央库
gx deps dupes 用来帮助我们查看重复导入的库,例如相同的库 在不同位置导入了 不同的 hash。
gx deps stats 用来输出关于依赖的状态信息,包括 Total Import Count、Unique Import Count 、Average Import Depth ,可以大概用来了解依赖关系的复杂度。
并且会 install 到 $GOPATH/bin
我们在没有使用 gx 时,导入了 go-lightrpc/rpcserver
不要忘记把 bin 目录放到 PATH 中哦
全部显示出来通常不是我查看依赖的需求,更常用的是针对某个库进行检查,gx 同时提供了 --highlight 选项来过滤感兴趣的内容
$ gx update mypkg QmbH7fpAV1FgMp6J7GZXUV6rj6Lck5tDix9JJGBSjFPgUd
之后我们将 go-lightrpc 通过 gx publish 发布得到
QmYaVXmXZNpWs6owQ1rk5VAiwNinkTh2cYZuYx1JDSactL 这个 hash
Publishing and Releasing
导入依赖
注意:gx import 这个操作会去修改我们已经写好的代码,例如:
如果你想在本地开发测试,在服务器上执行编译和运行,那么服务器上也至少要运行一个 ipfs daemon 了,此时你直接把本地 ipfs 连到 服务器上,如 'ipfs swarm connect 服务器ipfsid' ,当然你也可以选择交叉编译,go 提供的交叉编译能力还是很让人满意的。
从指定的中央库导入一个库
创建一个 golang 的工程,并在工程工程根目录gx init 后,会生成一个 package.json 文件用来描述你的库,执行 gx publish 后将会得到一个 hash 值,这是与你当前库的版本相对应的唯一ID,以后导入包时需要使用。
可以通过 .gxignore 文件来指定 gx 要在 publish 中忽略的文件,和 .gitignore 的作用类似,同时 gx 也遵守 .gitignore 约定。
查看直接依赖,还可以通过 -r -s 来查看全部依赖