NPM 本地私有仓库,是在本地搭建NPM私有仓库,对公司级别的组件库进行管理。在日常开发中,经常会遇到抽象公共组件的场景,在项目内部进行公用。新的项目开始时,也会拷贝一份创建一个新的项目,这样做不易于管理,也没有进行有效的版本控制,组件升级之后,也很难对已有项目进行更新,最后个项目各自为政,各自维护,新开发功能不能共享。
公司的共用组件大多是公司内部资产,由于涉及到知识产权的问题,禁止发布到公网。所以,内部前端私有仓库非常有必要,开源的 NPM 私有仓库又很多选择,轻量级例如Verdaccio,我这里用的是 Nexus,Nexus 的优势是,它不仅支持 NPM 私有仓库,也支持 Maven 的私有仓库,这样前后端都可以用同一个系统去管理,减轻了运维的压力。
安装
使用 docker 进行安装,进入查看是否安装成功 http://localhost:8081/
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3
## 查找 admin 密码
docker exec -ti nexus cat /opt/sonatype/sonatype-work/nexus3/admin.password
创建项目
下面我们添加一个项目进行测试
- 创建测试项目
mkdir test-module
cd test-module
npm init -y
2 添加文件 index.js
function greet(name) {
return `Hello, ${name}!`;
}
module.exports = greet;
-
创建仓库
输入名称,设置是否允许更新,这里设置的是允许重新发布。
设置 Security – Realms,激活 npm Bearer Token Realm
-
提交新项目
设置 registry
npm config set registry http://nexus-server-url:8081/repository/localnpm/
登录并提交项目
npm login --registry=http://nexus-server-url:8081/repository/localnpm/
npm publish
检查项目是否上传成功
- 设置 repository group,由于本地仓库初始化时只有内部库,而开发项目时我们需要很多三方库,Nexus 支持缓存外部库。拉取时我们要指定 registry 为 repository group,这个group 包括两个本地仓库和代理仓库,本地库找不到,就去代理库找,添加代理仓库和仓库组。
添加 npm proxy,设置taobao 镜像地址
添加仓库组:
设置registry 并测试
#设置registry,这样可以拉到本地库和远程三方库
npm config set registry http://nexus-server-url:8081/repository/npm-all/
#发布时要指定为本地仓
npm publish --registry http://nexus-server-url:8081/repository/localnpm/
错误排查
如果遇到以下问题
com.orientechnologies.orient.core.storage.impl.local.paginated.OLocalPaginatedStorage - Exception 5F000189
in storage plocal:/nexus-data/db/config
: 2.2.36 (build d3beb772c02098ceaea89779a7afd4b7305d3788, branch 2.2.x)
com.orientechnologies.orient.core.exception.OStorageException: Cannot open local storage ‘/nexus-data/db/config’ with mode=rw
## 删除wal 文件,重启即可
rm -rf /nexus-data/db/config/*.wal
密码重置
## 登录容器
docker exec -it nexus /bin/bash
## 进如数据库目录
cd /nexus-data/db
## 进入数据库控制台
java -jar $NEXUS_HOME/lib/support/nexus-orient-console.jar
## 链接数据库
connect plocal:./security admin admin
## 查询 Admin
select * from user where id = "admin"
## 修改密码为admin123
update user SET password="$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==" UPSERT WHERE id="admin"
这时应该可以正常进入了,如果不行,重新启动 Nexus