私有NPM搭建笔记

为什么需要私有NPM

  1. 首先公司内部的项目是必须私有。
  2. 跨项目公共代码维护极不方便。
  3. 方便积累维护自己的公共包。

常用私有NPM的解决方案

选择使用verdaccio

  • 简单,简单,简单,无需配置数据库
  • 无需同步所有的npm包,不会磁盘爆掉

大概下面长这样:
verdaccio npm

安装方法

  • 全局安装

    1
    npm install -g verdaccio
  • 启动服务,命令行运行,或者使用 PM2 、forever 后台运行

    1
    verdaccio --listen 4000 --config ~./config.yaml

config 配置 https://www.verdaccio.org/docs/en/configuration

  • 添加用户/登录

    1
    npm adduser --registry  http://localhost:4873
  • 上传私有包

    1
    npm publish --registry http://localhost:4873
  • 配置本地npm源地址,推荐使用nrm 管理

    1
    2
    3
    4
    5
    6
    npm config list -l # 查看默认配置
    # 将默认地址 https://registry.npmjs.org/ 改成私有地址
    npm set registry http://localhost:4873
    # 如果您使用HTTPS,请添加适当的CA信息
    #(“null”表示从操作系统获取CA列表)
    $ npm set ca null

详细文档看这里 https://www.verdaccio.org/docs/en/installation

基本工作流权限控制

现在采用源码重新构建的方式,添加用户权限控制页面,所有的管理员都可以通过个人中心添加和修改其它用户权限,默认 npm addUser 用户是没有访问和发布权限的。

默认使用 verdaccio-htpasswd 插件,发现插件内部在做 权限分组的时候只是 做了 groups = [name] ,也就是用户名等于分组名 ,无法满足对每个用户按照分组管理。

解决方案:

添加用户的时候通过用户名做key映射一个唯一分组,然后在中间件获取用户分组权限的位置通过用户名把权限合并进去。

这里通过用户名获取到用户权限

src\lib\auth.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function authenticatedUser(name: string, pluginGroups: Array<any>, config: Config) {
const isGroupValid: boolean = _.isArray(pluginGroups);
const groups = (isGroupValid ? pluginGroups : []).concat(['$all', '$authenticated', '@all', '@authenticated', 'all']);

// gbGroup
const {gbConfig} = config;
const gbGroupId = gbConfig.gbUserGroup.getItem(name) || 2;
const gbGroupName = _.isNil(gbGroupId) ? '' : gbConfig.gbGroupConfig[+gbGroupId];

return {
name,
groups: groups.concat(gbGroupName),
real_groups: pluginGroups,
};
}

三种权限,已添加用户不可删除,只能修改权限。这样也省去了做用户的CURD。

1
2
3
4
5
module.exports = {
0: 'none', // 没有访问 和 发布权限,黑名单,不影响使用包
1: 'admin', // 最高权限
2: 'visitor', // 只能看不能玩
};

疑问

查看源代码没有找到 npm addUser 时候 email参数的获取,默认只获取了 name 和 password ,整个流程都没有涉及到email

其它常见命令补充

完整文档看这里,https://docs.npmjs.com/cli/access 😄

用户相关

1
2
3
npm login #登陆
npm logout #退出
npm whoami #查看当前用户

发布升级相关

1
2
npm publish
npm unpublish --force xxx 强制下架
1
2
3
npm version patch #升级补丁版本号
npm version minor #升级副版本号
npm version major #升级主版本号