Npm 私库搭建
背景
随着Nodejs开发的项目越来越多,Node项目管理就成了一个需要思考的问题了。如果所有项目都开源统一用 NPM 进行管理也没什么问题,但总有一些是我们不希望的完全开放的代码,作为企业是核心秘密保留在公司内部,这个时候就需要在公司内网也搭建一套 NPM 依赖管理系统。
优点
-
方便,公司内部开发的私有包,统一管理,方便开发和使用
-
安全,由于公司内部开发的模块和一些内容并不希望其他无关人员能够看到,但是又希望内部能方便使用
-
加速,自己搭建npm 服务器,本身可以自带常用package的缓存, cnpm 有一些包存在路径问题,而npm 的速度有些感人,自建的服务器会缓存下载过的包,能节省时间
verdaccio 搭建外网
- 下载verdaccio
npm install --global verdaccio
// mac 请执行
sudo npm i verdaccio -g
- 运行 ( 生成配置文件)
verdaccio
运行结果如下
注:这里有配置文件的地址 我本地已修改了使用在局域网中使用所以是 http:// 0.0.0.0:4783
默认是这个4783
端口
3. 修改npm 地址
// 另外开一个命令窗口
// 查看本地npm 指向远程地址
npm config ls
// 这是可以看到
// registry = https://registry.npmjs.org/
// 修改registry地址为本地NPM私库
npm set registry http://localhost:4873
// 此时在一个新文件夹下 执行 npm install jQuery 就可以看到下载的地址
也可以设置http://0.0.0.0:4873
4. 配置相关
storage: ./storage
plugins: ./plugins
web:
title: Verdaccio
auth:
htpasswd:
file: ./htpasswd
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
'@*/*':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
server:
keepAliveTimeout: 60
middlewares:
audit:
enabled: true
logs:
{ type: stdout, format: pretty, level: http }
storage
已发布的包的存储位置,默认存储在 ~/.config/Verdaccio/
文件夹下
plugins
插件所在的目录
web
界面相关的配置
auth
用户相关,例如注册、鉴权插件(默认使用的是 htpasswd
)
uplinks
用于提供对外部包的访问,例如访问 npm、cnpm 对应的源
packages
用于配置发布包、删除包、查看包的权限
server
私有库服务端相关的配置
middlewares
中间件相关配置,默认会引入 auit
中间件,来支持 npm audit
命令
logs
终端输出的信息的配置
-
权限管控
-
包管控
packages: '@*/*': access: $all publish: $authenticated unpublish: $authenticated proxy: npmjs '**': access: $all publish: $authenticated unpublish: $authenticated proxy: npmjs
这里的 key 代表对应权限需要匹配的包名,例如对于第一个,如果我们发布的包名是这样的
@wjc/test
就会命中。每个规则中对应 4 个参数。其中proxy
代表如果在私有 npm 库找不到,则会代理到 npmjs(对应unlinks
中的npmjs
的https://registry.npmjs.org/
)。而剩下的 3 个参数,都是用来设置包相关的权限,它有三个可选值$all
(所有人)、$anonymous
(未注册用户)、$authenticated
(注册用户)。那么,下面我们分别看一下这 3 个参数的含义:access
控制包的访问权限publish
控制包的发布权限unpublish
控制包的删除权限
-
账户管控
因为此时注册用户是没有限制的,也就是说如果你的私有 npm 库部署在外网环境的话,任何人都可以通过
npm adduser
命令注册用户。显然,这是不允许出现的情况,所以这里我们需要设置
auth
的max_users
为-1
,它代表的是禁用注册用户:auth: htpasswd max_users: -1
-
-
发布包到NPM私库
-
确保在npm官网注册过账号密码
请在npm官网注册一个账号,记住用户、密码和邮箱,后续上传包需要用到
地址 https://www.npmjs.com
-
将用户名密码添加到verdaccio
npm who am i // 查看自己登陆情况 npm adduser --registry http://localhost:4873 // 新增用户 // 依次输入官网注册的用户、密码和邮箱即可 // 注册登录成功后,可以看到verdaccio的配置文件夹 多了一个文件:htpasswd
-
上传包
新建文件夹demo,进到文件夹下执行命令:创建本地化仓库
npm init -y
然后再创建入口文件 index.js
文件内随便写个 console.log(‘我最帅!!!’)
然后发布
npm publish --registry http://localhost:4873
注意 发布可能会 报错 vision
在需要上传的包路径下,先执行版本号+1命令:
有时候出现上图的版本错误,可能是因为包的文件名被占用了,是公有库的文件名比如vue啊这些自己的包都不能叫这个名字。
npm version patch -m "Version %s - v0.0.1"
然后就可以push了
-
-
下载包
此时需要在一个新的文件夹下载包
npm install demo
也可以 下载 其他的包 比如 lodash
npm install lodash
此时你可以在verdaccio中看到你的下载
-
切换成内网
配置文件路径在启动verdaccio的控制台可以看到:
// pc C:\Users\xxx\AppData\Roaming\verdaccio\config.yaml // mac /Users/guoke/.config/verdaccio/config.yaml
打开文件,末尾追加:
listen: 0.0.0.0:4873
然后重启verdaccio服务即可。此时 需要我们小伙伴一起设置这个
npm set registry http://你的IP:4873
就可以愉快的玩耍了
如果小伙伴需要发布包需要新增账户和登录
-
取消发布
上传搞错了,又不想追加版本,可以删除上一个版本的包,命令如下:
npm unpublish demo@0.0.1
-
离线同步包
verdaccio 配置中有一个store 会指定存放位置 文件夹名称为 storage
此文件夹 是缓存之前已下载的的包 直接拷贝复制就可以完成离线同步
注意 离线情况下会特别慢 因为这里会请求uplink的服务资源 需要修改配置
-
遗留问题
- 用户权限管控
- Nexus 集成
- 如何线程守护 如 pm2
- docker 一键部署
- 本地存储单个包 以及包的依赖问题 node-sass
- 发布通知和订阅
- 已缓存包的列表展示(官方未更新 可能会在6.0更新)
12. 项目同步到内网出现的问题
相同的package.json 在内网无法跑起来 各种文件缺失的问题和版本不对情况, 此时可能是你在外网 npm install 的时候走了缓存 、此时你可以把package.json 拿到一个空的文件夹下 进行 npm install ,然后再把你的storge 包同步一次就可以了(这个问题折磨了我一天)
完
参考文献
安装 https://blog.csdn.net/Beam007/article/details/118694543
离线 https://blog.csdn.net/cui_yuanqing/article/details/105379118
官网 https://verdaccio.org/zh-CN/docs/what-is-verdaccio
nexus https://blog.csdn.net/qq_35577655/article/details/118963859
其他 https://juejin.cn/post/6932264833312096270#heading-3