npm 私有源搭建

目标

搭建一套私有 npm 服务,支持以下功能:

  • 发布管理私有 npm 包;
  • 提供 npm 镜像服务,加速 npm 安装依赖速度;

方案

CNPM 为开发者提供了一套简单易用的私有源解决方案。它支持以下功能:

  • 支持发布和管理私有源;
  • 部署简单;
  • 支持两种自动同步方案:
    • 全量同步(全量同步指定源的所有 package);
    • 只同步已有的 npm package;
  • 支持手动同步,自动同步有一定时延,手动同步可以即时生效;
  • 提供配套的客户端工具 cnpm,也支持官方 npm cli。

部署

CNPM 提供了多种方式部署,相对来说,使用 docker 部署的方式更加灵活方便。

前置依赖

部署过程

通过 CNPM git 仓库 下载 CNPM 源码。

定制系统配置

CNPM docker 方式部署的默认系统配置在 docs/dockerize/config.js 文件中,可在此更改相关配置,如管理员帐号、数据库配置等。

下面列举一些常见配置项:

scopes

scopes 值为字符串数组,用于定义本私有源的 scope。例如:

scopes: ['@cnpm', '@alife']
admins

admins 值为 name:email 的键值对,用于设置系统管理员。例如:

admins: {
    // name: email
    admin: 'admin@cnpmjs.org',
    tony: 'tony@gmail.com'
},
mail

mail 值为对象,用于设置发送系统邮件的邮箱帐号。例如:

mail: {
    enable: false,
    appname: 'cnpmjs.org',
    from: 'cnpmjs.org mail sender <adderss@gmail.com>',
    service: 'gmail',
    auth: {
          user: 'address@gmail.com',
          pass: 'your password'
    }
}
database

database 值为对象,用于设置数据库信息。CNPM 默认使用密码为空的 root 账户创建及管理 MySQL,建议单独创建 MySQL 用户。

**创建方式:**在源码根目录下找到 docker-compose.yml 文件,对 mysql-db 的 environment 配置中设置以下字段:

  • MYSQL_ROOT_PASSWORD: root666 #设置 root 密码
  • MYSQL_USER: cnpmjs #创建 cnpmjs 用户
  • MYSQL_PASSWORD: cnpmjs666 #cnpmjs 用户密码
  • MYSQL_DATABASE: cnpmjs #mysql database

并删除 MYSQL_ALLOW_EMPTY_PASSWORD 字段(允许使用空密码登录)。

同时,修改系统配置:

database: {
    db: 'cnpmjs',    // 对应 MYSQL_DATABASE
    username: 'cnpmjs', // 对应 MYSQL_USER
    password: 'cnpmjs666', // 对应 MYSQL_PASSWORD

    // 其他配置不建议更改
}
sourceNpmRegistry

sourceNpmRegistry 值为字符串,设置同步的源。默认为淘宝源: 'https://registry.npm.taobao.org'

示例:

sourceNpmRegistry: 'https://registry.npm.taobao.org'
syncModel

syncModel 值为'none' 'all''exist',用于设置系统同步模式。默认为 'none'

  • none: 不同步任何模块,从 sourceNpmRegistry 中代理所有公共模块
  • exist:只同步已有的模块
  • all:同步所有模块

示例:

syncModel: 'exist', // 'none', 'all', 'exist'
alwaysAuth

alwaysAuth 值为布尔,设置是否始终都需要进行用户鉴权,即使是 cnpm install。默认为 false

示例:

alwaysAuth: false
customReadmeFile

customReadmeFile 值为文件路径字符串,用于自定义首页文案。私有源服务部署成功后,会有一个 landing page 展示私有源的相关信息,这些信息通过 docs/web/readme.md 的 markdown 文件进行维护。想要自定义 landing page 可设置该项来替换这个文件。

其他参数请参考 docs/dockerize/config.js 文件。

构建 docker 镜像并启动

在当前代码库根目录下运行以下命令即可创建并运行镜像:

docker-compose up

该命令会使用当前的代码库构建 docker 镜像,并设置一个初始化的 MySQL 实例。当容器开始运行,将会创建两个 web 服务:

一般来说,我们会在后台启动 docker 镜像:

docker-compose up -d

至此,npm 私有源服务已启动成功。我们如何使用该私有源呢?

使用

部署好 npm 私有源服务后即可开始使用,这里,默认本地已安装 node 及 npm。

使用 cnpm

  1. 全局安装 cnpm 命令行工具

    npm install -g cnpm --registry=https://registry.npm.taobao.org
  2. 安装完成后设置 cnpm 源

    cnpm set registry http://127.0.0.1:7001
  3. 进入你的项目后,使用 cnpm install 即可安装依赖。

发布私有包

  1. 确保您的 cnpm 源是私有源,如果不是,先将 cnpm 源设为私有源地址:

    cnpm set registry http://127.0.0.1:7001
  2. 注册并登录私有源服务

    按提示填写 username、密码、email 即可。

    cnpm adduser
  3. 设置私有包名为 @scope/package 格式

    默认 scope 是 cnpm,可修改服务配置,详情查看上节【定制系统配置】。

    示例如下所示:

    {
      "name": "@cnpm/my-package",
      "version": "1.0.2",
      "description": "a private package.",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "@cnpm/his-package": "^1.0.1"
      }
    }
  4. 发布

    cnpm publish
  5. 给其他人增加发布权限

    cnpm owner add user1
  6. 删除其他人的发布权限

    cnpm owner rm user1