Nexus respository 搭建前端 npm 私服

有些老项目,已经在生产环境稳定运行多时,但是他的个别依赖在npm下架了,后人无法正常下载依赖怎么办呢?

  • 对于比较熟悉,或者可以轻松找到替换版本的,建议直接升级或替换
  • 升级或替换风险较高,那么继续使用原依赖

这里我属于第二种情况,所以搭建了 Nexus respository oss 来实现缺失依赖的下载.

环境:

  • docker 29.1.3
  • node v22.16.0

1. 准备目录(数据持久化)

随意自定义,我这里创建了:

bash 复制代码
/Users/carry/disk/docker-volume

2. 启动 Nexus 容器

注意将/Users/carry/disk/docker-volume替换为自己的目录

bash 复制代码
docker run -d \
--name nexus \
-p 8081:8081 \
-v /Users/carry/disk/docker-volume:/nexus-data \
sonatype/nexus3

3. 获取初始管理员密码

注意将/Users/carry/disk/docker-volume替换为自己的目录

bash 复制代码
cat /Users/carry/disk/docker-volume/nexus/admin.password

4. 访问 GUI

GUI 路径: http://localhost:8081

账号密码:admin/刚刚获取的密码

4.1.1. 创建 npm 仓库结构
1️⃣ 创建 npm-hosted (私有)

用于手动保存已经下架的包

scss 复制代码
Settings → Repositories → Create repository → npm (hosted)

🌸 记得点击底部的 Create repository

2️⃣ 创建 npm-proxy (公共 npm 代理)

用于兜底

scss 复制代码
Create repository → npm (proxy)
3️⃣ 创建 npm-group (对外统一入口)
sql 复制代码
Create repository → npm (group)

到这里框架搭建完成,现在可以在 Browse菜单下看见npm-hostednpm-proxynpm-group,都是空的.

5. 保存已下架包

5.1. 从 node_modules 反向还原 npm 包

chokidar-next@4.0.14为例,可以通过一下命令验证公共包中不存在此包

perl 复制代码
npm view chokidar-next@4.0.14

我这里是本地有安装过,直接去 node_modules 寻找,确保有package.json + 代码文件,然后在依赖根目录运行

shell 复制代码
npm pack
# 根据 package.json 生成 .tgz
# ${name}-${version}.tgz
# 可以在 package.json 修改 name、description、version

6. 发布私有包

🌵 准备工作

这里我折腾了好久,始终 401🫠, 让我们将其放在准备工作部分

6.1.1. 启用 Nexus 的 "npm Bearer Token Realm"

然后重启 nexus(不用担心前面的操作白费,我们刚刚做了持久化呀) 🌸 记得 save

6.1.2. 新建发布用户

这里我直接用了 nx-admin权限

6.1.3. 选做(细化权限)

不想用 nx-admin权限,可以细化,去 Settings -> Repository -> Roles新建角色并授权即可

新建角色

仓库npm-hosted为例,需要授权所有nx-repository-view-npm-npm-hosted-*权限

给用户授权

nx-anonymous(读) + 自定义角色(写)

6.1.4. tip

如果你刚刚跳过了准备工作,已经执行过了 login 命令

那么先执行:

npm logout --registry=http://127.0.0.1:8081/repository/npm-hosted/

然后删除 ~/.npmrc中与 http://127.0.0.1:8081相关的内容,再继续下面的步骤

1️⃣ 登录私有仓库

ini 复制代码
npm login \
  --registry=http://127.0.0.1:8081/repository/npm-hosted/

2️⃣ 发布

ini 复制代码
npm publish \
  --registry=http://127.0.0.1:8081/repository/npm-hosted/

成功后在 npm-hostednpm-group都可以看见发布的包

7. 使用私服下载

7.1. 部分走私服

明确知道极个别依赖是公网没有的,使用前缀区分,可以自定义,我这里使用 @carrie

1️⃣ 配置项目 .npmrc
ruby 复制代码
# 其他依赖走公共镜像
registry=https://registry.npmjs.org/
# @carrie 前缀的依赖走私服 注意:在发包的时候也需要有 @carrie前缀
@carrie:registry=http://127.0.0.1:8081/repository/npm-group/
2️⃣ 运行 npm i
package-lock.json 分析

package-lock.json 中

7.2. 全部走私服

1️⃣ 配置项目 .npmrc
ini 复制代码
registry=http://127.0.0.1:8081/repository/npm-group/

所有的依赖都从私服下载

私服内部: 优先去 npm-hosted 下载,没有则走 npm-proxy 配置到公共镜像源下载

2️⃣ 运行 npm i
package-lock.json 分析

package-lock.json 中

  • 所有包的 resolved 都是私服

8. 共用

前面所有的操作都是在本地 docker 跑的,要分享给其他人使用只需要将 docker 镜像跑在服务器即可(使用方记得将 registry 替换为服务器的路径)

有趣 🌻

相关推荐
hedley(●'◡'●)21 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751523 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育23 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再23 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
liu****42 分钟前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术
CappuccinoRose1 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花1 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员2 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
logocode_li2 小时前
OCI/CRI 双标准下:从 dockerd 到 containerd 的 K8s 运行时迭代史
docker·云原生·容器·k8s