为什么要搭建公司内部的npm服务?
如今前端圈已十分繁荣,技术实现上一般都是前后端分离的,这就导致了前端承受的分工压力会越来越大,前端项目容易变得庞杂,根据不同的业务线切分成多个项目工程,这个时候公共的组件库就发挥重要角色了。上传到npm库是个很不错的选择,不同的项目都指向一个npm源,然后通过npm install就可以了,既方便又快速。
Nexus简介
Nexus是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。此外,他还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。
Nexus私服是在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载jar包时,先请求私服,私服上如果存在则下载到本地仓库。否则,私服直接请求外部的远程仓库,将jar包下载到私服,再提供给本地仓库下载。
运行
windows
- 将nexus.exe设置成以管理员身份运行
- cd {nexus解压后目录/nexus-版本号/bin/}
- nexus.exe /install
- nexus.exe /start
Mac
- cd {nexus解压后目录/nexus-版本号/bin/}
- ./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看下密码
类型介绍
proxy
代理仓库,将公共 npm 服务器的资源代理缓存,减少重复下载,加快开发人员和CI服务器的下载速度。
该仓库地址为:http://localhost:8081/repository/npm-center/group
仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
该仓库地址为:http://localhost:8081/repository/npm-public/hosted
是本地仓库,用于上传自己的npm包 以及第三方npm包。
该仓库地址为:http://localhost:8081/repository/npm-release/
配置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设置永久登录
- 登录group
npm login --registry=http://localhost:8081/repository/npm-public/ --always-auth
- 登录hosted
npm login --registry=http://localhost:8081/repository/npm-release/ --always-auth
以上设置后,打开~/.npmrc文件验证,内容大致如下:
如果在操作过程中如果遇到 Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager" ,这个时候要去浏览器登录私服检查 权限 的配置,设置–Security–Realms,把
npm Bearer Token Realm添加到Active里面,然后保存。![]()
-
发布包
- 在package.json 配置
"publishConfig" : {
"registry" : "http://localhost:8081/repository/npm-release/"
}
然后在包根目录执行npm publish就搞定了,可以说是非常方便了。
- 如果不想在package.json配置,也可以在命令行指定。
npm publish --registry=http://localhost:8081/repository/npm-release/
-
安装包
比如这里安装刚才传上私服上的vue-test,跟平时的安装方式一样,使用npm install vue-test安装包。
关于包名冲突问题,我发现包名相同的话,版本号不同的话会并入原有,但是版本号相同的话,命令行显示是发布成功的,但是私服上面是没有变化的,原因不明。
-
更新 npm 包版本
如果对npm包的内容进行了更新,需要升级npm包版本。我们采用语义化版本。
格式:主版本号.次版本号.修订号
版本号递增规则:
主版本号:当你做了不兼容的 API 修改
次版本号:当你做了向下兼容的功能性新增
修订号:当你做了向下兼容的问题修正
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸
使用npm version查看当前包版本号
更新版本号并发布
- 通过
npm version 新版本号直接更新版本
- 通过
npm version <update_type>自动改变版本
update_type 取值,意义及演示:
patch:补丁,版本变化示例:v1.0.1 -> v1.0.2,使用命令:npm version patchminor:小改,版本变化示例:v1.1.0 -> v1.2.0,使用命令:npm version minormajor:大改,版本变化示例:v1.0.0 -> v2.0.0,使用命令:npm version major例如我们这里用minor做示范,见证奇迹的时刻到了:
-
删除包(有坑)
取消发布包的单个版本
npm unpublish [<@scope>/]<pkg>@<version>
取消发布整个包
npm unpublish [<@scope>/]<pkg> --force
但是!按照文档说的输入npm unpublish vue-test@1.0.1,报错了。
估计是默认仓库地址的原因,在后面加上指定的链接,显示删除成功了。
但是又!私服没有删除成功!我选择放弃命令行,登录私服,一键删除。当然了,这样的手段我们不推荐,新包倒是无所谓,旧包就危险,万一谁用了这个包呢。如果你实在不想再维护这个包了,我们还可以弃用这个包,推荐使用弃用替代删除。
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"
参考文献
- 使用 Nexus3 Repository Manager 搭建 npm 私服:www.cnblogs.com/cangqinglan…
- npm的nexus私服 E401 E500错误处理记录:blog.csdn.net/lqh4188/art…
- 语义化版本 2.0.0: semver.org/lang/zh-CN/
- npm-unpublish: docs.npmjs.com/cli/v7/comm…
- npm-deprecate:docs.npmjs.com/cli/v7/comm…
下载地址
- Nexus官方最新版下载地址为:www.sonatype.com/nexus-repos…
- 因为官网经常性下载失败,于是我在其他地方下载并存到百度云盘了,Nexus3下载地址为:
链接: pan.baidu.com/s/1Pfteu9NU…
密码: 5c4m