项目地址在:https://github.com/cnpm/cnpmjs.org
公司这边,原来的内部 npm 是基于官方开源的版本搭建。两年前搭建的东西,其实已经很旧了。这些年 Node.js 发展得那么快,虽然说不上哪里不够用,但反正是经常挂。
所以我决定用 cnpm 来替代它。
搭建
原来的 npm,数据库是基于 couchdb 的。虽然很多时候这东西被用来跟 mongodb 做比较,但其实我看了看它的功能,基本上是一个 key-value 类型的数据库。 稍微想要执行一些 find 语句都没法弄(这个后面会提到,在迁移的时候)。
首先,去 https://github.com/cnpm/cnpmjs.org 克隆项目下来。然后重点就是看 /config/index.js
里面的东西,基本能够轻易改造的选项都在里面。
配置数据库的时候,把这一句扔进去:https://github.com/cnpm/cnpmjs.org/blob/master/docs/db.sql
然后就可以跑起来了
找到老数据库的所有内部包
老的数据库,在 couchdb 中并没有标明那个是官方同步来的,哪个是自有的。即使有标注,couchdb 也不支持的带条件的查询,只支持 key-value 形式的。
但数据库中,有所有在内部注册的用户名,大概 100 多个。先把这些用户名都导出来。
接着,通过 /registry/_all_docs?include_docs=true
这个 couchdb 的查看语句,把整个数据库都导出来。一共 2g 多。json 格式的。
然后用 https://github.com/dominictarr/JSONStream 来处理这个文件,找到数据库中对应的内部用户名,把他们所有的包名都记下。
迁移老的数据库
迁移老的数据库时,我基本都没有怎么去看 cnpmjs 的代码。没有通过调用同步语句的方式来迁移老数据库。
我是复制了一个新的文件夹,新起一个 registry 的端口,然后把上游的地址配置成公司原来的 registry,
再批量通过 cnpm sync pkg_name
语句的方式,从最外层让 cnpm 把对应的包同步过来。如果是去查看代码并调用语句的话,第一是麻烦,其次是怕漏了某些元数据。
怕到时候修数据库比迁移更麻烦。从最外层做,比较保险。
内部的 npm 不知什么原因,已经很久不能同步官方源了。所以里面的版本大概是3个月前的。这次同步导致新 npm 中,很多常用包的版本被拖旧了。
在安装的时候,出现找不到版本的错误,不过通过 cnpm sync pkg_name
可以解决这个问题。倒是还挺方便。
相信随着时间向前,这些旧的元信息都会随着同步变成最新。
cnpm 客户端定制
这个,其实 cnpm 客户端的代码很简单。有需求的时候,直接看看源码改一改就好了。
腾讯这边的网络封锁比较严格,我做了一个代理相关的 patch,也提到官方源去了:https://github.com/cnpm/cnpm/pull/83
反正呢,搭建和改造的过程中,无论发现任何问题或者建议,我都会坚持回馈上游的。
淘宝那边,内部的 cnpm 定制版叫做 tnpm。腾讯这边,tencent 嘛,所以也叫 tnpm。。。。
clone 代码来搭建,还是用 cnpmjs.org 的 npm 包搭建
我始终觉得,业务代码如果抽象成了 npm 包是一种过度抽象。
cnpmjs.org 本身是一个 npm 的包,可以 npm install -g cnpmjs.org 之后,稍微配置一下就能跑。
关于这个过度抽象的问题,之前也有人希望把 https://github.com/cnodejs/nodeclub 变成这样的方式,相关的讨论在这边:
在啊,在wiki上加个如何从couchdb的npm源迁移到cnpm源的链接到这里,哈哈,括号写个英文标题吸引老外使用google翻译查看。clone方式适合你这种高级用户使用。 自豪地采用 CNodeJS ionic