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

元宇宙开发者
• 阅读 6641

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 的选项尚未验证是否可以将该选项去掉。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
MBR笔记
<bochs:100000000000e\WGUI\Simclientsize(0,0)!stretchedsize(640,480)!<bochs:2b0x7c00<bochs:3c00000003740i\BIOS\$Revision:1.166$$Date:2006/08/1117