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

cnpmjs

cnpmjs 是企业私有 npm 服务的解决方案,在其 Github Wiki 中给出了若干快速搭建该仓库并进行配置的方法。
这套笔记仅是笔者为了解决安装自己的 npm 库 这一问题而使用的方案,对于企业内部缓存的内容不做解释。
之前曾经尝试过 sinopiagit+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 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 的选项尚未验证是否可以将该选项去掉。

    原文作者:genefy
    原文地址: https://segmentfault.com/a/1190000010503203
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞