cnpmjs.org 搭建
发布于 4 年前 作者 alsotang 4731 次浏览 最后一次编辑是 3 年前 来自 分享

项目地址在: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 变成这样的方式,相关的讨论在这边:

https://github.com/cnodejs/nodeclub/issues/404

14 回复

在啊,在wiki上加个如何从couchdb的npm源迁移到cnpm源的链接到这里,哈哈,括号写个英文标题吸引老外使用google翻译查看。clone方式适合你这种高级用户使用。 自豪地采用 CNodeJS ionic

那cnpm不是淘宝的么?为什么淘宝内部还有一个tnpm?私有的么?

来自炫酷的 CNodeMD 越来越喜欢material design😁

@XGHeaven cnpm是只读的,但我们需要上传一些私有的包,这时候就放去 tnpm

@alsotang cnpm 只是把包同步到本地服务器的工作? 我要上传 怎么玩儿呢?

你指的 #公司这边# 是新东家鹅厂么?

@jaywcjlove 看过 cnpm 文档没有

@alsotang 哦,明白了

来自炫酷的 CNodeMD 越来越喜欢material design😁

@i5ting 有吗。。?

@i5ting 很难想象cnpmjs.org对于你这么一个经验丰富的nodejs开发者来说是这么难安装… 自豪地采用 CNodeJS ionic

@fengmk2 我是照着那5分钟例子来的,我也不是太差,竟然没搞定,5555.。。

回到顶部