ipfs 的御用包管理器 gx 入门指南
何为 gx
导入依赖
也可以只提供要更新的包的 hash
import "gx/ipfs/QmYaVXmXZNpWs6owQ1rk5VAiwNinkTh2cYZuYx1JDSactL/go-lightrpc/rpcserver"
$ go get -u github.com/whyrusleeping/gx
gx 会去 ipfs 中下载这个 hash 对应的包并且这个包的 hash、版本、名字 都会出现在你的 package.json 中
使用 gx
忽略:Ignoring files from a publish
列出指定中央库中包含的库
如果没有启动 ipfs 那么 gx 会从 ipfs.io 这个公共网关获取资源,在国内这个网关几乎是不可用的。
gx 可以像 maven 一样来指定中央库,不过因为 ipfs 的网络多是以不稳定的 pc 机组成,所以添加一个 node 作为中央库也未必可靠,除非这个库就是你自己部署的,如果是临时的就不建议添加了。
这样做时 gx 会去下载这个 hash 后检查名称并更新项目中对应的名称。
全部显示出来通常不是我查看依赖的需求,更常用的是针对某个库进行检查,gx 同时提供了 --highlight 选项来过滤感兴趣的内容
创建和发布一个包:
gx deps stats 用来输出关于依赖的状态信息,包括 Total Import Count、Unique Import Count 、Average Import Depth ,可以大概用来了解依赖关系的复杂度。
为了自动执行以上脚本,可以使用 release 子命令 gx release
将会自动帮你执行 version update 和 publish ,随后会执行你在 package.json 中通过 releaseCmd设置的指令,例如去获取你设置的 git commit -a -m \"gx publish $VERSION\",执行时 gx 会用 version 来覆盖 $VERSION 变量。 使用 gx 更新依赖非常简单
从指定的中央库导入一个库
使用 gx 前本地一定要先启动 ipfs daemon ,版本也是有要求的,用最新版 ipfs 总是没错的。
可以通过 .gxignore 文件来指定 gx 要在 publish 中忽略的文件,和 .gitignore 的作用类似,同时 gx 也遵守 .gitignore 约定。
工具会安装在 $
GOPATH/src/github.com/whyrusleeping/gx查看直接依赖,还可以通过 -r -s 来查看全部依赖
$ gx update mypkg QmbH7fpAV1FgMp6J7GZXUV6rj6Lck5tDix9JJGBSjFPgUd
$ gx init $ gx publish
$ gx repo add myrepo /ipns/QmPupmUqXHBxikXxuptYECKaq8tpGNDSetx1Ed44irmew3
设计程序依赖时尽量遵循以下原则:
之后我们将 go-lightrpc 通过 gx publish 发布得到
QmYaVXmXZNpWs6owQ1rk5VAiwNinkTh2cYZuYx1JDSactL 这个 hash工具要求
$ gx repo list myrepo events QmeJjwRaGJfx7j6LkPLjyPfzcD2UHHkKehDPkmizqSpcHT smalltree QmRgTZA6jGi49ipQxorkmC75d3pLe69N6MZBKfQaN6grGY stump QmebiJS1saSNEPAfr9AWoExvpfGoEK4QCtdLKCK4z6Qw7U
更新
$ gx import QmaDFJvcHAnxpnMwcEh6VStYN4v4PB4S16j4pAuC2KSHVr
本人在年初学习 IPFS (v0.4.12) 时并没有重视 gx 这个工具,甚至还在二次开发的过程中放弃了 gx 而改用 govendor 来进行 deps 的管理,这在后期升级 libp2p 时简直就是一场灾难。由于工作需要现在又需要使用 go-libp2p 来做一个 p2p 应用,所以下定决心一定要征服 gx
$ gx deps go-log QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52 1.2.0 go-libp2p-peer QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p 2.0.4 ......
$ gx deps -r -s go-base58 QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf 0.0.0 go-crypto Qme1boxspcQWR8FBzMxeppqug2fYgYc15diNWmqgDVnvn2 0.0.0 go-datastore QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU 1.0.0 go-ipfs-util QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1 1.0.0 go-keyspace QmUusaX99BZoELh7dmPgirqRQ1FAmMnmnBn3oiqDFGBUSc 1.0.0 go-libp2p-crypto QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ 1.0.4 go-libp2p-peer QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p 2.0.4 go-libp2p-peerstore QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD 1.2.5 ......
$ gx deps --tree ├─ go-base58 QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf 0.0.0 ├─ go-multihash QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku 0.0.0 │ ├─ go-base58 QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf 0.0.0 │ └─ go-crypto Qme1boxspcQWR8FBzMxeppqug2fYgYc15diNWmqgDVnvn2 0.0.0 ├─ go-ipfs-util QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1 1.0.0 │ ├─ go-base58 QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf 0.0.0 │ └─ go-multihash QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku 0.0.0 ......
$ gx deps --tree --highlight=go-crypto ├─ go-multihash QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku 0.0.0 │ └─ go-crypto Qme1boxspcQWR8FBzMxeppqug2fYgYc15diNWmqgDVnvn2 0.0.0 ├─ go-ipfs-util QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1 1.0.0 │ └─ go-multihash QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku 0.0.0 │ └─ go-crypto Qme1boxspcQWR8FBzMxeppqug2fYgYc15diNWmqgDVnvn2 0.0.0 ......
1、依赖关系深度最小化
2、尽量让依赖树的广度最小化,但是不要以牺牲深度作为代价
$ gx version 5.11.4
$ gx version patch updated version to: 5.11.5 $ gx version minor updated version to: 5.12.0 $ gx version major updated version to: 6.0.0
$ gx version minor updated version to: 6.1.0 $ gx publish package whys-awesome-package published with hash: QmaoaEi6uNMuuXKeYcXM3gGUEQLzbDWGcFUdd3y49crtZK $ git commit -a -m "gx publish 6.1.0" [master 5c4d36c] gx publish 6.1.0 2 files changed, 3 insertions(+), 2 deletions(-)