verdiccio搭建npm私库(linux)

1,227 阅读11分钟

npm私库的优点

  • 使公司内部公共代码的复用更加方便
  • 发布和下载npm包可以配置权限管理
  • 速度比在直接在npm下载更快,甚至是比淘宝源更快

Linux安装nodejs(如果已安装跳过这步)

查找对应版本

查看系统版本uname -a

查找系统版本.png

然后去官网复制链接地址

英文网址:nodejs.org/en/download…

中文网址:nodejs.cn/download/

选择阿里云镜像

选择镜像.png

选择与系统对应的安装包,右键复制链接地址

安装包地址.png

npm.taobao.org/mirrors/nod…

下载&安装

在根目录(或者你喜欢的目录)下新建一个叫做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

接下来确定 nodejsbin 目录中,有 nodenpm 两个文件,如果有,那么说明我们前面的步骤都没有问题。(没有的话要么是下载的资源有问题,要么是解压出现问题了)

ll 查看文件及目录详情,Ubuntu默认不支持命令ll,必须用 ls -l(可以进行修改)

查看文件详情.png

添加环境变量或配置软连接

解压完后我们还不能使用 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 的版本,如果出现版本号则配置成功

查看node版本1.png

配置软连接(了解)

这里只是让你了解如何建立软连接,使其变为全局命令,不推荐使用

找到全局环境PATH路径

输入 echo $PATH 回车

查找path路径.png

你可以选择任何一个以:隔开的路径做为系统环境路径,通常会选/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版本的查看

查看node版本.png

pm2 和 verdaccio 也是一样需要添加软连接

这里只演示pm2的软连接,verdaccio也是一样的配置

  1. 找到pm2的安装路径

安装的时候可以找到它的安装路径

查看安装路径.png

  1. 进行软连接
ln -s /node/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/
  1. 进行验证
pm2 list

出现类似以下的日志就表示软连接创建成功了!(只有第一次使用命令会出现如下显示)

img

verdaccio安装

安装

npm i verdaccio -g

使用 verdaccio 运行

verdaccio

使用http://localhost:4873/ 进行页面访问

verdaccio页面1.png

远程访问

此时只能在本地访问,在 config.yaml 最后一行新增如下配置就可以远程访问

listen: 0.0.0.0:4873

config.yaml的存放目录可以在 verdaccio 运行时的第一行看到

config.yarml的存放目录.png

进入到对应目录修改并保存退出

wq保存退出.png

现在你就可以使用 ip地址:4873 (如:http://124.71.98.129:4873/)来访问页面了

verdaccio页面.png

详细配置请查看官方文档

安装进程守护工具

通过安装 pm2 或者 forever 可以守护 verdaccio 的进程一直运行

如果你使用了nvm更改nodejs版本 可能使用 pm2 启动时的状态一直是 stopped ,我暂时没有找到解决方法,可以使用 forever 替代pm2

这里我们安装pm2,本节结尾给出 forever 的安装使用方法

安装

npm install pm2 -g

运行 verdaccio

pm2 start verdaccio

statusonline 就表示运行成功了

运行verdaccio.png

打开你的服务器地址 http://124.71.98.129:4873/ 就会显示以下画面

这里需要将云服务器的 4873 端口开放,可以在云服务器的控制台的安全组中添加 4873 端口

verdaccio页面2.png

pm2的相关命令

启动

可以像这样启动任何应用程序(Node.jsPythonRuby$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

更多命令请查看官方的 github主页官方教程

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 的位置

config.yarml的存放目录.png

具体参数如下:

# 存放所有软件包的目录
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来生成账号

注册账号1.png

将生成的 htpasswd 文件的条目复制到 htpasswd 文件中就可以登录了

注册账号2.png

第二种

安装 htpasswd-for-sinopia 工具来添加账号

 npm install htpasswd-for-sinopia -g

 sinopia-adduser   // 在 有htpasswd文件的目录下执行 /root/.config/verdaccio

/root/.config/verdaccio 文件目录下执行 sinopia-adduser 创建账号,如果该文件夹下没有 htpasswd 文件,创建一个即可

sinopia-adduser 

注册账号3.png

现在添加了 xiaoli 登录成功

注册账号4.png

修改相关包的权限

仓库安装资源有顺序的,是依次之上往下检索

packages:
  '@*/*':  
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: taobao

  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: taobao

先来了解一下包的匹配规则:

'**' 代表匹配所有包最终的索引位置,'@*/*' 代表 @ 开头 / 分隔的包,例如:'@abc/def'

每个对应的匹配规则下有四个参数:

  1. access 访问权限

  2. publish 发布包权限

  3. unpublish 删除包权限

  4. 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

现在不登陆就看不到我们刚刚发布的包了

查看包1.png

登录后才能看到发布的包

查看包2.png

设置指定用户

如果我们想要指定用户访问、上传或者删除包可以进行如下操作:

# 添加以test-开头的的规则
  'test-*':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated
    proxy: taobao

hrpasswd 中查看已有用户

查看用户.png

只添加一个 aaron 用户允许上传

# 添加多个用户可以用空格隔开,如:publish: aaron yang 
 'test-*':
    access: $authenticated
    publish: aaron
    unpublish: $authenticated
    proxy: taobao

查看当前登录用户的命令为 npm whoami

现在我们来测试一下,切换用户为 yang,显示拒绝上传

拒绝上传.png

切换为 aaron 上传成功

上传成功.png

使用插件进行用户分组

插件地址 github.com/btshj-snail…

使用插件可以使我们更方便的进行用户分组

# 安装
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.png

安装完成后输入 nrm ls 查看所有镜像源地址

查看镜像.png

镜像源地址的添加

// nrm add <registry> <url>
nrm add verdaccio http://服务器ip地址:4873

添加镜像地址.png

使用 nrm ls 查看所有的镜像源,验证是否添加成功

查看添加的镜像源.png

nrm use verdaccio使用 verdaccio 镜像源

使用镜像源.png

nrm常用命令

nrm ls 					   // 查看可选源(带*号即为当前使用源)
nrm current 			   // 查看当前使用源
nrm use <registry>		   // 切换源
nrm add <registry> <url>   // 添加源
nrm del <registry>		   // 删除源
nrm test <registry>		   // 测试源速度

发布npm包

登录

切换完镜像源地址之后,我们可以使用npm adduser进行用户添加登录,需要依次输入用户名、密码、邮箱

登录用户.png

现在我们可以在页面进行登录了!

在verdaccio页面登录.png

发布包

我们在本地创建一个包将它上传上去

创建包.png

创建一个 say 函数

创建函数.png

修改版本

修改版本.png

发布

发布包.png

现在网页上已经显示我们上传的 test-01

页面显示.png

成功发布的私有的包,可以在其他模块里面使用npm install [package name]来安装, 而私有npm 里面不包含的包、例如你要安装一个vuewebpack 这样的包。找不到的话,会被代理到 npm.js 官网去下载,并且会帮你缓存在 ./storage 文件夹里面。再次下载,就能体验飞一般的速度了。

测试

现在将 test-01下载下来测试一下

下拉包.png

导入到 demo.js 中使用

使用包.png

删除包

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进行用户添加,需要依次输入用户名、密码、邮箱

添加用户.png

现在我们可以使用 npm whoami 来查看现在登录的用户

查看登录用户.png

我们还可以用该账号在私库页面进行登录

私库登录页面.png

登录

如果你已经有一个账号了,可以使用如下命令进行登录:

npm login

然后依次输入账号、密码、邮箱

用户登录.png

发布包

我们在本地写一个demo了解一下发布包的过程

npm init -y

使用 npm init -y 可以快速初始化项目,生成的 package.js 文件中包含了这个项目的详细信息

初始化项目.png

添加 index.js

npm-test01.png

发布

写好demo后进行发布:

npm publish

发布包01.png

现在已经发布成功了

发布成功.png

测试

我们来下载之前发布的包进行一下测试

  1. 安装包
npm i npm-test01

安装包.png

  1. 使用包

使用包01.png

包信息的添加

如果我们不进行包信息的添加,那么在私库上就看不到关于包的信息,从而了解这个包的作用

包信息1.png

添加READENE.md

READENE.md 是对包的说明,对这个包大致信息的一个介绍

readme.png

现在创建一个README文件,然后发布

readme2.png

发布成功后我们可以看到如下效果

readme3.png

添加其他信息

{
  "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" // 许可
}

添加信息.png

其他链接

verdaccio verdaccio.org/

pm2 pm2.keymetrics.io/

forever github.com/foreversd/f…

npm中文文档 www.npmjs.cn/

nodejs中文网 nodejs.cn/

verdiccio搭建npm私库(windows) juejin.cn/post/699993…