cnpmjs
cnpmjs 是企业私有 npm 服务的解决方案,在其 Github Wiki 中给出了若干快速搭建该仓库并进行配置的方法。
这套笔记仅是笔者为了解决安装自己的 npm 库 这一问题而使用的方案,对于企业内部缓存的内容不做解释。
之前曾经尝试过 sinopia 和 git+ssh
的方案,前者因为项目最后更新为 2 年前,不敢用(而且你是 build failing
好吗),后者在 @Azard 的使用中发现会遇到 npm 调用 git 的权限问题,十分难以解决。
服务端部署
cnpmjs 支持 MySQL,Postgres,SQLite,Mariadb 这一系列的关系型数据库。在快速部署当中,仅需要准备 node.js 环境。cnpmjs 会使用默认的 sqlite 数据库存储信息并启动。
$ nohup cnpmjs.org start --admins='myname,othername' --scopes='@my-company-name,@other-name' &
这种依靠一条命令进行配置的方法轻便但不利于维护。尤其会在下面提到的通过修改 config 文件的内容,在此命令运行下 cnpmjs 不适用
从源码部署当中提及了编辑自己的配置文件 config/config.js
,请不要修改原有的 config/index.js
在服务启动之后,于 ~/.cnpmjs.org/
下会有 logs
文件夹出现,可以进入查看服务器启动状态,同时可以创建 ~/.cnpmjs.org/config.js
,其效果等同于上面自己的配置文件,会覆盖默认配置。
需要修改的配置主要有:(参考自 CNPM 配置指南【实战填坑】)
$ sudo vi $HOME/.cnpmjs.org/config.json
{
"database": {
"db":"cnpmjs",
"dialect":"mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "yourpassword",
"pool": {
"maxConnections": 10,
"minConnections": 0,
"maxIdleTime": 30000
}
},
"enablePrivate": true,
"syncModel": "none",
"bindingHost":"0.0.0.0",
"admins": {
"sanzhi": "i@sanzhi.me",
},
"scopes": ["@company"],
"registryHost":"npm.sanzhi.me",
"alwaysAuth":false
}
部署过程中可能出现的问题:
- 从 npm 包快速部署会牺牲配置可变性
- 数据库请预先配置好,建议 MySQL,在项目地址上找不到多少用 SQLite 的。
bindingHost
admins
registryHost
scopes
都是重要的配置项,其中-
bindingHost
默认在127.0.0.1
不配置无法远程访问 -
admins
决定了可以发包的用户(接下来会提到) -
scopes
是企业内部包的名称,据说不能发不带scopes的包(未验证) -
registryHost
是之后用户下载包内容的地址。十分重要。默认为 cnpmjs 官方。如果没有域名,请填写 xxx.xxx.xxx.xxx:7001 的格式
-
部署成功以可以访问 7002 端口的 web 页面为判别条件。
发包
发包在进入你需要发的项目文件夹后就两个命令。
一个是要确保你在私有仓库的登录状态,通过 npm set registry http://xxx.xxx.xxx.xxx:7001
预先设置 npm 的注册地址为你的私有仓库。http://
不能忘了,否则就会发现登录的时候卡在那里,过了一分多钟才有反应。登录使用 npm adduser
, npm login
均可。之后会输入如下信息
Username:sanzhi
Password:********
E-Mail(This is public):i@sanzhi.me
第一次登录视同注册,之后你就处于私有仓库的登录状态,可以使用 npm publish
发包。发好了之后去私有仓库的 web 页面就可以搜到,默认 web 页面在 7002 端口
客户端调用
在确认 registry 被设置好后,使用 npm install @company/packagename
进行拉取。如果服务器没有另外设定包的访问权限,则无需登录。
在这个过程中,npm 会先访问 http://xxx.xxx.xxx.xxx/7001/@company/packagename
获取 json 信息,在该信息里的 version.xxx.dist.tarball
中存着某个版本的下载地址。这个地址的前缀即上面的 registryHost
。
总结
cnpmjs 是以面向业界为主流的开源框架,其配置文档(即 wiki )非常具有功利性而缺少详细的配置项解说,这与其强大多样的功能不对等,且过时或存在少许问题的文档居多,在复制粘贴配置的过程中务必小心而不要贪图 5 分钟快速配置。
关于 scope 的选项尚未验证是否可以将该选项去掉。