利用 nexus 布署私有 npm 仓库

布署

基于 docker 布署 nexus3。

docker pull sonatype/nexus3
docker volume create --name nexus-data
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3

镜像详情:https://hub.docker.com/r/sonatype/nexus3

将IP和端口发布到外网,或直接使用内网IP和端口,以下用 192.168.1.11:8081 为例。

权限

Roles

创建新组 publishPrivlleges 选择 nx-repository-view-*-*-*

Users

创建新用户 npmRoles 选择 publish

Realms

Active 添加 npm Bearer Token Realm

仓库

Blob Stores (可选)

新增存储,TypeFileNamenpm

Repositories

  1. proxy 仓库
    1. 新增仓库,Recipenpm(proxy)
    2. Namenpm-proxyRemote storagehttps://registry.npm.taobao.orgBlob storenpm ,其他默认
  2. hosted 仓库
    1. 新增仓库,Recipenpm(hosted)
    2. Namenpm-privateBlob storenpm ,其他默认
    3. 保存后生成的 URLhttp://192.168.1.11:8081/repository/npm-private/
  3. group 仓库
    1. 新增仓库,Recipenpm(group)
    2. NamenpmBlob storenpmMember repositoriesMembersnpm-proxynpm-private ,其他默认
    3. 保存后生成的 URLhttp://192.168.1.11:8081/repository/npm/

本地拉取

npm i -g nrm
nrm add local http://192.168.1.11:8081/repository/npm
# 设置sass-binary-site
npm config set sass-binary-site https://registry.npmmirror.com/node-sass
# 安装包
npm i -S private/package

开发

在本地开发目录下执行 npm init ,生成配置,可以都使用默认值。生成 package.json ,示例如下:

{
  "name": "private.package",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
  }
}

package.json 添加以下配置:

  "publishConfig": {
    "registry": "http://192.168.1.11:8081/repository/npm-private"
  },

编写包代码,可以在需要安装的项目中直接引入本地包:

npm i -S /path/to/npm/package

当修改包代码时,安装包的项目会自动更新。

发布

版本控制

npm有一套自己的版本控制标准——Semantic versioning(语义化版本)。package.json里面有一个version字段,具体体现为:

对于 "version":"x.y.z"

  1. 修复bug,小改动,增加z
  2. 增加了新特性,但仍能向后兼容,增加y
  3. 有很大的改动,无法向后兼容,增加x

通过 npm version <update_type> 自动改变版本,update_typepatch, minor,或 major,分别表示补丁,小改,大改。

身份认证

运行 echo -n 'npm:password' | openssl base64password 替换为 npm 账号的密码) ,生成编码(例如 xxx )。编辑 ~/.npmrc ,追加以下配置:_auth=xxx

发布

npm publish [--tag=beta]