npm私库的优点
- 使公司内部公共代码的复用更加方便
- 发布和下载npm包可以配置权限管理
- 速度比在直接在
npm
下载更快,甚至是比淘宝源更快
Linux安装nodejs(如果已安装跳过这步)
查找对应版本
查看系统版本uname -a
然后去官网复制链接地址
中文网址:nodejs.cn/download/
选择阿里云镜像
选择与系统对应的安装包,右键复制链接地址
下载&安装
在根目录(或者你喜欢的目录)下新建一个叫做node的文件夹,进入该目录
.cd / #切换到根目录
.mkdir node && cd node #创建一个叫做node的文件夹并进入到文件夹内
两种方法:第一种纯命令行操作的方法(推荐) 第二种大家也可以直接把对应版本的
nodejs
压缩包下载到本地,之后上传到云服务器上然后解压这里采用的是第一种
在该目录下运行下载命令
# wget 资源链接地址 进行下载
wget https://npm.taobao.org/mirrors/node/v14.17.5/node-v14.17.5-linux-x64.tar.xz
将压缩包进行解压
# tar -xvf 刚下载的压缩包名称 进行解压
tar -xvf node-v14.17.5-linux-x64.tar.xz
解压后的文件夹名字太长了,重命名为合适的文件名
# mv 解压后的资源包名 nodejs
mv node-v14.17.5-linux-x64 nodejs
接下来确定 nodejs
的 bin
目录中,有 node
和 npm
两个文件,如果有,那么说明我们前面的步骤都没有问题。(没有的话要么是下载的资源有问题,要么是解压出现问题了)
ll
查看文件及目录详情,Ubuntu
默认不支持命令ll
,必须用ls -l
(可以进行修改)
添加环境变量或配置软连接
解压完后我们还不能使用 node
命令,需要进行环境变量或者软连接的配置
单独配置软连接的方式不推荐,因为每次进行
npm i 应用名 -g
后都需要进行软连接的配置,只配置一次环境变量显然方便的多,不过这里也进行介绍
配置环境变量
打开配置文件
vim /etc/profile
在最下面添加 export PATH=$PATH: node 下 bin 目录的路径
export PATH=$PATH:/node/nodejs/bin
如果已经存在path
,用:
分割在后面添加即可
export PATH=路径1:路径2:$PATH:/node/nodejs/bin
保存退出执行 source /etc/profile
立即生效,最后查看 node
的版本,如果出现版本号则配置成功
配置软连接(了解)
这里只是让你了解如何建立软连接,使其变为全局命令,不推荐使用
找到全局环境PATH路径
输入 echo $PATH
回车
你可以选择任何一个以:隔开的路径做为系统环境路径,通常会选/usr/local/bin
,然后使用 ln -s
进行软连接
# ln -s 安装目录 /usr/local/bin/
ln -s /node/nodejs/bin/npm /usr/local/bin/
ln -s /node/nodejs/bin/node /usr/local/bin/
配置成功后,可以进行node
版本的查看
pm2 和 verdaccio 也是一样需要添加软连接
这里只演示pm2
的软连接,verdaccio
也是一样的配置
- 找到
pm2
的安装路径
安装的时候可以找到它的安装路径
- 进行软连接
ln -s /node/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/
- 进行验证
pm2 list
出现类似以下的日志就表示软连接创建成功了!(只有第一次使用命令会出现如下显示)
verdaccio安装
安装
npm i verdaccio -g
使用 verdaccio
运行
verdaccio
使用http://localhost:4873/ 进行页面访问
远程访问
此时只能在本地访问,在 config.yaml
最后一行新增如下配置就可以远程访问
listen: 0.0.0.0:4873
config.yaml
的存放目录可以在 verdaccio
运行时的第一行看到
进入到对应目录修改并保存退出
现在你就可以使用 ip地址:4873
(如:http://124.71.98.129:4873/)来访问页面了
详细配置请查看官方文档
安装进程守护工具
通过安装 pm2
或者 forever
可以守护 verdaccio
的进程一直运行
如果你使用了
nvm
更改nodejs
版本 可能使用pm2
启动时的状态一直是stopped
,我暂时没有找到解决方法,可以使用forever
替代pm2
这里我们安装
pm2
,本节结尾给出forever
的安装使用方法
安装
npm install pm2 -g
运行 verdaccio
pm2 start verdaccio
status
为 online
就表示运行成功了
打开你的服务器地址 http://124.71.98.129:4873/ 就会显示以下画面
这里需要将云服务器的
4873
端口开放,可以在云服务器的控制台的安全组中添加4873
端口
pm2的相关命令
启动
可以像这样启动任何应用程序(Node.js
、Python
、Ruby
、$PATH
中的二进制文件...)
pm2 start app.js # 启动 app.js
查看
列出所有运行中的命令
pm2 list
管理(停止、重启、删除)
pm2 stop <app_name|namespace|id|'all'|json_conf>
pm2 restart <app_name|namespace|id|'all'|json_conf>
pm2 delete <app_name|namespace|id|'all'|json_conf>
信息
# 了解有关特定应用程序的更多详细信息
pm2 describe <id|app_name>
# 显示应用程序的所有信息
pm2 show <id|app_name>
监控
监控日志、自定义指标、应用程序信息
pm2 monit
零停机重新加载
在不停机的情况下更新应用程序(热加载)
pm2 reload all
日志
显示指定应用程序的日志
pm2 logs <app-name>
杀死所有进程
pm2 kill
forever
安装
npm install forever -g
使用
从根目录进入到目录 node/nodejs/lib/node_modules/verdaccio/build/lib/
,运行cli.js
cd node/nodejs/lib/node_modules/verdaccio/build/lib/
forever start cli.js
脚本
如果觉得每次找目录麻烦,可以编写一个脚本运行
cd nodejs/lib/node_modules/verdaccio/build/lib/
forever start cli.js
exit
常用命令
forever start cli.js # 启动脚本
forever stop cli.js # 停止脚本 Id|Uid|Pid|Index|Script
forever stopall # 停止所有脚本
forever restart cli.js # 重启脚本
forever restartall # 重启所有脚本
注意: 运行脚本时,需要进入脚本所在目录
verdaccio详细配置
在 config.yaml
中可以修改 verdaccio
的相关配置
默认路径在 /root/.config/verdaccio
可以运行 verdaccio
查看 config.yaml
的位置
具体参数如下:
# 存放所有软件包的目录
storage: ./storage
# 存放所有插件的目录
plugins: ./plugins
web:
# 网站Title
title: Verdaccio
# 禁用Gravatar头像
# gravatar: false
# 排序方式 asc|desc
# sort_packages: asc
# 是否启用暗黑模式
# darkMode: true
# logo地址
# logo: http://somedomain/somelogo.png
# favicon地址
# favicon: http://somedomain/favicon.ico | /path/favicon.ico
# i18n翻译配置
# i18n:
# 可用列表见:https://github.com/verdaccio/ui/tree/master/i18n/translations
# web: en-US
auth:
htpasswd:
file: ./htpasswd
# 最大注册用户数,默认为 "+inf".
# 可用通过设置为-1禁止注册
# max_users: 1000
# 上游npm库,这里可用设置为淘宝
uplinks:
npmjs:
url: https://registry.npmjs.org/
taobao:
url: https://registry.npm.taobao.org/
packages:
# 作用域包
'@*/*':
# 允许所有人访问
access: $all
# 注册用户可访问
publish: $authenticated
# 注册用户可访问
unpublish: $authenticated
proxy: taobao
'**':
# 默认情况下所有用户 (包括未授权用户) 都可以查看和发布任意包
# 你可以指定 用户名/分组名 (取决于你使用什么授权插件,默认的授权插件是内置的 htpasswd)
# 访问权限有三个关键词: "$all", "$anonymous", "$authenticated"
# $all 表示不限制,任何人可访问;
# $anonymous 表示未注册用户可访问;
# $authenticated 表示只有注册用户可访问
access: $all
# 允许所有注册用户发布/撤销已发布的软件包
# (注意:默认情况下任何人都可以注册)
publish: $authenticated
unpublish: $authenticated
# 如果私有包服务不可用在本地,则会代理请求到'taobao'
proxy: taobao
# 您可以指定传入连接的HTTP /1.1服务器保持活动超时(以秒为单位)。
# 值为0会使http服务器的行为类似于8.0.0之前的Node.js版本,后者没有保持活动超时。
# 解决方法:通过给定的配置可以解决以下问题
server:
keepAliveTimeout: 60
# 中间件
middlewares:
audit:
enabled: true
# 日志设置
logs: { type: stdout, format: pretty, level: http }
# 开放远程访问,允许所有IP
listen:
- 0.0.0.0:4873
默认语言
Verdaccio
默认语言是英文,配置中文只需要找到对应位置进行如下修改:
# translate your registry, api i18n not available yet
i18n:
# list of the available translations https://github.com/verdaccio/ui/tree/master/i18n/translations
web: zh-CN
用户权限
默认所有用户都可以注册,先把注册关闭
auth:
htpasswd:
file: ./htpasswd
max_users: -1
注册账号
现在有两种方法可以注册账号
第一种
verdaccio 的认证是基于 verdaccio-htpasswd, 可以通过官方提供的工具htpasswd-generator来生成账号
将生成的 htpasswd
文件的条目复制到 htpasswd
文件中就可以登录了
第二种
安装 htpasswd-for-sinopia
工具来添加账号
npm install htpasswd-for-sinopia -g
sinopia-adduser // 在 有htpasswd文件的目录下执行 /root/.config/verdaccio
在 /root/.config/verdaccio
文件目录下执行 sinopia-adduser
创建账号,如果该文件夹下没有 htpasswd
文件,创建一个即可
sinopia-adduser
现在添加了 xiaoli
登录成功
修改相关包的权限
仓库安装资源有顺序的,是依次之上往下检索
packages:
'@*/*':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: taobao
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: taobao
先来了解一下包的匹配规则:
'**'
代表匹配所有包最终的索引位置,'@*/*'
代表 @
开头 /
分隔的包,例如:'@abc/def'
每个对应的匹配规则下有四个参数:
-
access
访问权限 -
publish
发布包权限 -
unpublish
删除包权限 -
proxy
代理(表示如果在私有npm
库找不到,则会代理到设置的镜像源地址,可设置多个用空格隔开)
权限设置有三个可选值:"$all"
(所有人),"$anonymous"
(未注册用户),"$authenticated"
(注册用户)
proxy
的可选值则在配置的上游链(上游npm
库)中来选择:
# 上游npm库,默认只有一个,这里添加淘宝镜像源
uplinks:
npmjs:
url: https://registry.npmjs.org/
taobao:
url: https://registry.npm.taobao.org/
现在我们来试着把页面设置成只有注册用户才能访问
把 '**'
的 access
改为 $authenticated
就可以了:
'**':
access: $authenticated
publish: $authenticated
unpublish: $authenticated
proxy: taobao
现在不登陆就看不到我们刚刚发布的包了
登录后才能看到发布的包
设置指定用户
如果我们想要指定用户访问、上传或者删除包可以进行如下操作:
# 添加以test-开头的的规则
'test-*':
access: $authenticated
publish: $authenticated
unpublish: $authenticated
proxy: taobao
在 hrpasswd
中查看已有用户
只添加一个 aaron
用户允许上传
# 添加多个用户可以用空格隔开,如:publish: aaron yang
'test-*':
access: $authenticated
publish: aaron
unpublish: $authenticated
proxy: taobao
查看当前登录用户的命令为 npm whoami
现在我们来测试一下,切换用户为 yang
,显示拒绝上传
切换为 aaron
上传成功
使用插件进行用户分组
使用插件可以使我们更方便的进行用户分组
# 安装
npm install verdaccio-simplegroup -g
在 config.yaml
中进行配置
auth:
simplegroup:
companyPublish: aaron yang
companyUnpublish: aaron
packages:
'test-*':
access: $authenticated
publish: companyPublish
unpublish: companyUnpublish
proxy: taobao
该方法无效,作者没有回答github上的issue
config.yaml模板
# 存放所有软件包的目录
storage: ./storage
# 存放所有插件的目录
plugins: ./plugins
web:
# 网站Title
title: Verdaccio
# 禁用Gravatar头像
# gravatar: false
# 排序方式 asc|desc
# sort_packages: asc
# 是否启用暗黑模式
# darkMode: true
# logo地址
# logo: http://somedomain/somelogo.png
# favicon地址
# favicon: http://somedomain/favicon.ico | /path/favicon.ico
# i18n翻译配置
# i18n:
# 可用列表见:https://github.com/verdaccio/ui/tree/master/i18n/translations
# web: en-US
auth:
htpasswd:
file: ./htpasswd
max_users: -1
# 最大注册用户数,默认为 "+inf".
# 可用通过设置为-1禁止注册
# max_users: 1000
# 上游npm库,这里可用设置为淘宝
uplinks:
npmjs:
url: https://registry.npmjs.org/
taobao:
url: https://registry.npm.taobao.org/
packages:
# 作用域包
'@*/*':
# 允许所有人访问
access: $all
# 注册用户可访问
publish: $authenticated
# 注册用户可访问
unpublish: $authenticated
proxy: taobao
'**':
# 默认情况下所有用户 (包括未授权用户) 都可以查看和发布任意包
# 你可以指定 用户名/分组名 (取决于你使用什么授权插件,默认的授权插件是内置的 htpasswd)
# 访问权限有三个关键词: "$all", "$anonymous", "$authenticated"
# $all 表示不限制,任何人可访问;
# $anonymous 表示未注册用户可访问;
# $authenticated 表示只有注册用户可访问
access: $all
# 允许所有注册用户发布/撤销已发布的软件包
# (注意:默认情况下任何人都可以注册)
publish: $authenticated
unpublish: $authenticated
# 如果私有包服务不可用在本地,则会代理请求到'taobao'
proxy: taobao
# 您可以指定传入连接的HTTP /1.1服务器保持活动超时(以秒为单位)。
# 值为0会使http服务器的行为类似于8.0.0之前的Node.js版本,后者没有保持活动超时。
# 解决方法:通过给定的配置可以解决以下问题
server:
keepAliveTimeout: 60
# 中间件
middlewares:
audit:
enabled: true
# 日志设置
logs: { type: stdout, format: pretty, level: http }
# 开放远程访问,允许所有IP
listen: 0.0.0.0:4873
verdaccio存在的问题
当服务器重启时,verdaccio
主页面上有时会不显示从本地发布的包,此时包还是在缓存文件夹storage
中的
解决办法:
verdaccio-db.json
可以配置前端页面package
包的显示
如果你在你的服务器中发现了很多storage
文件夹并包含verdaccio-db.json
,在(一般在配置文件夹和安装node的文件夹中),将它们全部删除,将所有的缓存包也删除,然后上传一个包测试一下,这时会自动生成一个verdaccio-db.json
,我的在/root/storage
,现在再重启就不会出现包消失的问题了了
本地的使用
安装nrm
nrm提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址
在本地win + r 打开命令行工具进行安装
安装完成后输入 nrm ls
查看所有镜像源地址
镜像源地址的添加
// nrm add <registry> <url>
nrm add verdaccio http://服务器ip地址:4873
使用 nrm ls
查看所有的镜像源,验证是否添加成功
nrm use verdaccio
使用 verdaccio 镜像源
nrm常用命令
nrm ls // 查看可选源(带*号即为当前使用源)
nrm current // 查看当前使用源
nrm use <registry> // 切换源
nrm add <registry> <url> // 添加源
nrm del <registry> // 删除源
nrm test <registry> // 测试源速度
发布npm包
登录
切换完镜像源地址之后,我们可以使用npm adduser
进行用户添加登录,需要依次输入用户名、密码、邮箱
现在我们可以在页面进行登录了!
发布包
我们在本地创建一个包将它上传上去
创建一个 say 函数
修改版本
发布
现在网页上已经显示我们上传的 test-01
了
成功发布的私有的包,可以在其他模块里面使用npm install [package name]
来安装, 而私有npm
里面不包含的包、例如你要安装一个vue
、webpack
这样的包。找不到的话,会被代理到 npm.js
官网去下载,并且会帮你缓存在 ./storage
文件夹里面。再次下载,就能体验飞一般的速度了。
测试
现在将 test-01下载下来测试一下
导入到 demo.js 中使用
删除包
npm unpublish test-01 --force // 清除发布的包
如果没有切换镜像源来添加用户,则需要指定镜像源来进行操作
npm adduser --registry http://localhost:4873 //添加功能,无账号的添加完毕直接包
npm login --registry http://localhost:4873 //登录功能,有账号的话可以直接使用这个
npm publish --registry http://localhost:4873 //发布包
npm包的缓存
配置好私有仓库之后,每次我们下载公共包的时候,会自动把包文件缓存在
/root/.config/verdaccio/storage
私有包也是会存在 storage 这个文件夹下面的,当公共包被缓存之后,再次下载的时候,会首先在这个仓库中获取,会大大加速包文件的下载速度。
如果想避免缓存的话可以在 config.yml
中设置 cache: false
,将仅缓存元数据文件(package.json)
uplinks:
npmjs:
url: https://registry.npmjs.org/
cache: false
默认情况下,Verdaccio
需要等待 2 分钟才能使缓存元数据无效,然后再从远程注册表获取新信息。
设置 maxage
可以延长缓存过期时间
uplinks:
npmjs:
url: https://registry.npmjs.org/
maxage: 30m
如果不经常更新依赖项,这可能是一个有效的策略
发布npm包
如果我们想发布自己写好的方法或组件,可以按照以下步骤进行发布
登录
添加用户
在真实环境中如果你没有权限添加用户,请联系管理员给你添加账号
首先我们要保证现在的镜像源地址为私库地址,切换完镜像源地址之后,我们可以使用npm adduser
进行用户添加,需要依次输入用户名、密码、邮箱
现在我们可以使用 npm whoami
来查看现在登录的用户
我们还可以用该账号在私库页面进行登录
登录
如果你已经有一个账号了,可以使用如下命令进行登录:
npm login
然后依次输入账号、密码、邮箱
发布包
我们在本地写一个demo
了解一下发布包的过程
npm init -y
使用 npm init -y
可以快速初始化项目,生成的 package.js
文件中包含了这个项目的详细信息
添加 index.js
发布
写好demo
后进行发布:
npm publish
现在已经发布成功了
测试
我们来下载之前发布的包进行一下测试
- 安装包
npm i npm-test01
- 使用包
包信息的添加
如果我们不进行包信息的添加,那么在私库上就看不到关于包的信息,从而了解这个包的作用
添加READENE.md
READENE.md
是对包的说明,对这个包大致信息的一个介绍
现在创建一个README
文件,然后发布
发布成功后我们可以看到如下效果
添加其他信息
{
"name": "npm-test", // 项目名称
"version": "1.3.0", // 项目版本
"description": "这是一个提供测试的包,只能测试", // 项目描述
"main": "index.js", // 主文件
"scripts": { // //指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "yang", // 作者
"contributors": [ // 贡献者
{
"name": "xxx",
"email": "xx1@xxx.com"
},
{
"name": "xx2",
"email": "xx2@xxx.com"
}
],
"dependencies": { // 核心依赖
"core-js": "^3.6.5",
"vue": "^2.6.11"
},
"devDependencies": { // 开发依赖
"@h3/jenkins-2-dingtalk": "^1.7.10"
},
"peerDependencies": { // 引用的关联依赖,不会强制安装,缺失会警告
"@h3/antd-vue": ">=1.4.10",
"lodash": ">=4.17.15",
"vue": ">=2.6.11",
"vue-template-compiler": ">=2.6.11"
},
"bugs": { // 对应code repo的issue
"url": "httxxxxk/issues",
"email":"cxxx"
},
"homepage": "http://www.baidu.com", // 跳转页面
"engines": { // 可以告知该报依赖什么node版本乃至什么版本的npm
"node": ">= 12.0.0",
"npm" : "^6.0.0"
},
"repository": { // code repo
"type": "git",
"url": "httpxxxx-hook.git"
},
"publishConfig": { // 指定发布域,就是指向私有仓
"registry": "http://xxx"
},
"license": "ISC" // 许可
}
其他链接
verdaccio
verdaccio.org/
forever
github.com/foreversd/f…
npm中文文档
www.npmjs.cn/
nodejs中文网
nodejs.cn/
verdiccio搭建npm私库(windows)
juejin.cn/post/699993…