为什么需要私有NPM
- 首先公司内部的项目是必须私有。
- 跨项目公共代码维护极不方便。
- 方便积累维护自己的公共包。
常用私有NPM的解决方案
cnpm 淘宝cnpm 方案 http://blog.fens.me/nodejs-cnpm-npm/
verdaccio (sinopia fork) https://www.verdaccio.org/
选择使用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
6npm 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.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function 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
5module.exports = {
0: 'none', // 没有访问 和 发布权限,黑名单,不影响使用包
1: 'admin', // 最高权限
2: 'visitor', // 只能看不能玩
};
疑问
查看源代码没有找到 npm addUser 时候 email参数的获取,默认只获取了 name 和 password ,整个流程都没有涉及到email
其它常见命令补充
完整文档看这里,https://docs.npmjs.com/cli/access 😄
用户相关1
2
3npm login #登陆
npm logout #退出
npm whoami #查看当前用户
发布升级相关
1 | npm publish |
1 | npm version patch #升级补丁版本号 |