npm私有库服务搭建及规范定制

npm私有库服务


简介

公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件、模块和项目。对于前端,最熟悉的莫过于npm,bower等;但是bower的市场兼容性明显没有npm强壮,加之commonjs规范的日益成熟。npm应该是前端包管理的不二选择。

公司对于搭建本地私有npm库有如下要求:

  1. 私有包托管在内部服务器中
  2. 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包
  3. 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库
  4. 服务器硬盘有限,希望只缓存下载过的包,而不是全部同步。
  5. 对于下载,发布npm包有对应的权限管理,安装方便,配置简单,依赖少。

安装私有包流程


服务搭建

node + npm + verdaccio + pm2 + nrm

Sinopia Verdaccio是一个零配置的私有的带缓存功能的npm包管理工具

PS: Sinopia多年未更新,Verdaccio是基于Sinopia重构的,注入了更多活力

1
2
3
4
5
6
# config
$ /home/ubuntu/.config/verdaccio/config.yaml
# password
$ /home/ubuntu/web_npm/verdaccio/htpasswd
# storage
$ /home/ubuntu/web_npm/verdaccio/storage

pm2 托管Sinopia进程可以保证进程永远存活
nrm 便于查看和切换当前使用的registry
verdaccio-delegated-auth 是为了让服务支持自定义验证的插件


标准定制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Sinopia config.yaml
# path to a directory with all packages
storage: /home/ubuntu/web_npm/verdaccio/storage
auth:
# htpasswd:
# file: ./htpasswd
# max_users: -1
# mix_users: 1000
delegated-auth:
url: https://your-account-server/
user_key: name # username field, default: username
pwd_key: password # password field, default: password

# a list of other known repositories we can talk to
uplinks:
npmjs:
url: http://registry.npm.taobao.org/

packages:
'@company/*':
# scoped packages
access: $authenticated
publish: $authenticated
'*':
# keywords: "$all", "$anonymous", "$authenticated"
access: $all
publish: $all
proxy: npmjs

# log settings
logs:
- {type: stdout, format: pretty, level: http}
#- {type: file, path: sinopia.log, level: info}
listen: 0.0.0.0:4873
  1. 为避免客户端创建虚假用户、或失误创建用户,会关闭注册用户功能max_users: -1,采用服务端提供用户账户配置file: ./htpasswd的方式新增用户。
    已经为verdaccio编写自定义验证插件,使用自己的账户系统的用户名和密码进行登录验证verdaccio-delegated-auth
  2. 公司内部发布包到私有服务需要加上前缀@company/${app},例如@company/lodash。前缀包@company/*必须经过账户验证后才能正常执行安装或发布。(company指公司名称)
  3. 发布内部私有包必须有项目自述README,内容必须包含:
    • 基本描述
    • 使用方式
    • 源码地址

客户端使用

  1. 安装nrm新增私有服务代理,使用自己的账户系统账号登录使用。

    1
    2
    3
    $ nrm add company http://126.*.*.99:4873/
    $ nrm use company
    $ npm login
  2. 浏览器访问私有服务,查看所有内部私有包。


安全

网关

更多

Github: https://github.com/yansenlei