npm私服配置介绍

7,376 阅读5分钟

为什么要搭建公司内部的npm服务?

如今前端圈已十分繁荣,技术实现上一般都是前后端分离的,这就导致了前端承受的分工压力会越来越大,前端项目容易变得庞杂,根据不同的业务线切分成多个项目工程,这个时候公共的组件库就发挥重要角色了。上传到npm库是个很不错的选择,不同的项目都指向一个npm源,然后通过npm install就可以了,既方便又快速。

Nexus简介

Nexus是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。此外,他还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。

Nexus私服是在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载jar包时,先请求私服,私服上如果存在则下载到本地仓库。否则,私服直接请求外部的远程仓库,将jar包下载到私服,再提供给本地仓库下载。

运行

windows

  1. 将nexus.exe设置成以管理员身份运行
  2. cd {nexus解压后目录/nexus-版本号/bin/}
  3. nexus.exe /install
  4. nexus.exe /start

Mac

  1. cd {nexus解压后目录/nexus-版本号/bin/}
  2. ./nexus run

在浏览器中输入http://localhost:8081 ,如果一切顺利,你可以看到Nexus Repository Manager管理页面。

默认账号为admin,密码admin123
如果报Incorrect username or password, or no permission to use the application.,那就进/sonatype-work/nexus/admin.password看下密码

类型介绍

image.png

配置npm私服

  • 初始化 npm 工程

随便进入一个目录,使用 npm init -y 初始化package

  • 查看nodejs的默认仓库地址

如果没有配置过,应该就是显示 registry.cnpmjs.org/

npm config get registry
  • 接下来重新设置nodejs的默认仓库地址(全局npm私服)

npm set registry http://localhost:8081/repository/npm-public/
  • 登陆npm私服

依次输入用户名/密码/邮箱,用户名/密码/邮箱都是私服上配置好了的。--always-auth设置永久登录

  1. 登录group
npm login --registry=http://localhost:8081/repository/npm-public/ --always-auth
  1. 登录hosted
npm login --registry=http://localhost:8081/repository/npm-release/ --always-auth

以上设置后,打开~/.npmrc文件验证,内容大致如下: image.png

如果在操作过程中如果遇到 Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager" ,这个时候要去浏览器登录私服检查 权限 的配置,设置–Security–Realms,把npm Bearer Token Realm添加到Active里面,然后保存。 image.png image.png

  • 发布包

  1. 在package.json 配置
"publishConfig" : {
    "registry" : "http://localhost:8081/repository/npm-release/"
}

然后在包根目录执行npm publish就搞定了,可以说是非常方便了。

image.png image.png

  1. 如果不想在package.json配置,也可以在命令行指定。
npm publish --registry=http://localhost:8081/repository/npm-release/

image.png

  • 安装包

比如这里安装刚才传上私服上的vue-test,跟平时的安装方式一样,使用npm install vue-test安装包。

image.png

关于包名冲突问题,我发现包名相同的话,版本号不同的话会并入原有,但是版本号相同的话,命令行显示是发布成功的,但是私服上面是没有变化的,原因不明。

  • 更新 npm 包版本

如果对npm包的内容进行了更新,需要升级npm包版本。我们采用语义化版本

格式:主版本号.次版本号.修订号

版本号递增规则:
	主版本号:当你做了不兼容的 API 修改
	次版本号:当你做了向下兼容的功能性新增
	修订号:当你做了向下兼容的问题修正
	
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸

使用npm version查看当前包版本号

企业微信截图_e1118afa-2c45-4cd5-978d-26e0a756f377.png

更新版本号并发布

  1. 通过 npm version 新版本号 直接更新版本

image.png image.png

  1. 通过 npm version <update_type> 自动改变版本

update_type 取值,意义及演示:

  1. patch:补丁,版本变化示例:v1.0.1 -> v1.0.2,使用命令:npm version patch
  2. minor:小改,版本变化示例:v1.1.0 -> v1.2.0,使用命令:npm version minor
  3. major:大改,版本变化示例:v1.0.0 -> v2.0.0,使用命令:npm version major 例如我们这里用minor做示范,见证奇迹的时刻到了:

image.png 企业微信截图_45d50fc4-6ae5-47d4-bf0e-402b3b26a76a.png

  • 删除包(有坑)

取消发布包的单个版本

npm unpublish [<@scope>/]<pkg>@<version>

取消发布整个包

npm unpublish [<@scope>/]<pkg> --force

但是!按照文档说的输入npm unpublish vue-test@1.0.1,报错了。

image.png

估计是默认仓库地址的原因,在后面加上指定的链接,显示删除成功了。

image.png

但是又!私服没有删除成功!我选择放弃命令行,登录私服,一键删除。当然了,这样的手段我们不推荐,新包倒是无所谓,旧包就危险,万一谁用了这个包呢。如果你实在不想再维护这个包了,我们还可以弃用这个包,推荐使用弃用替代删除。

企业微信截图_9d74866c-fdd3-4fd6-ac06-3624d33e9876.png

npm-弃用

npm deprecate <pkg>[@<version range>] <message>

如果你的目的是鼓励用户升级,或者你不想再维护包了,请考虑改用deprecate命令。此命令将更新包的 npm 注册表项,向所有尝试安装它的人提供弃用警告。 弃用指定版本

npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"

SemVer传递给这个指令范围的解释,使得它们不包括预发布版本。例如:

npm deprecate my-thing@1.x "1.x is no longer supported"

参考文献

下载地址