使用 cnpmjs 搭建企业私有 npm 仓库

cnpmjs

cnpmjs 是企业私有 npm 服务的解决方案,在其 Github Wiki 中给出了若干快速搭建该仓库并进行配置的方法。
这套笔记仅是笔者为了解决安装本身的 npm 库 这一问题而使用的方案,对于企业内部缓存的内容不作解释。
以前曾经尝试过 sinopiagit+ssh 的方案,前者由于项目最后更新为 2 年前,不敢用(并且你是 build failing 好吗),后者在 @Azard 的使用中发现会遇到 npm 调用 git 的权限问题,十分难以解决。node

服务端部署

部署主要分为如下两种:快速部署以及从源码部署mysql

cnpmjs 支持 MySQL,Postgres,SQLite,Mariadb 这一系列的关系型数据库。在快速部署当中,仅须要准备 node.js 环境。cnpmjs 会使用默认的 sqlite 数据库存储信息并启动。git

$ nohup cnpmjs.org start --admins='myname,othername'  --scopes='@my-company-name,@other-name' &

这种依靠一条命令进行配置的方法轻便但不利于维护。尤为会在下面提到的经过修改 config 文件的内容,在此命令运行下 cnpmjs 不适用github

从源码部署当中说起了编辑本身的配置文件 config/config.js请不要修改原有的 config/index.js
在服务启动以后,于 ~/.cnpmjs.org/下会有 logs文件夹出现,能够进入查看服务器启动状态,同时能够建立 ~/.cnpmjs.org/config.js,其效果等同于上面本身的配置文件,会覆盖默认配置。web

须要修改的配置主要有:(参考自 CNPM 配置指南【实战填坑】sql

$ 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 都是重要的配置项,其中npm

    • bindingHost 默认在127.0.0.1 不配置没法远程访问
    • admins 决定了能够发包的用户(接下来会提到)
    • scopes 是企业内部包的名称,听说不能发不带scopes的包(未验证)
    • registryHost 是以后用户下载包内容的地址。十分重要。默认为 cnpmjs 官方。若是没有域名,请填写 xxx.xxx.xxx.xxx:7001 的格式

部署成功以能够访问 7002 端口的 web 页面为判别条件。json

发包

发包在进入你须要发的项目文件夹后就两个命令。
一个是要确保你在私有仓库的登陆状态,经过 npm set registry http://xxx.xxx.xxx.xxx:7001 预先设置 npm 的注册地址为你的私有仓库。http://不能忘了,不然就会发现登陆的时候卡在那里,过了一分多钟才有反应。登陆使用 npm addusernpm 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 的选项还没有验证是否能够将该选项去掉。

相关文章
相关标签/搜索