verdiccio搭建npm私库(windows)

1,240 阅读6分钟

npm私库的优点

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

本地搭建

本地搭建是为了测试使用,正式发布和下载包直接设置私库的镜像源地址即可

安装verdaccio

安装 verdaccio 前需要保证安装了 nodejs

# 打开命令行进行npm下载
npm install verdaccio -g  

安装完成后输入 verdaccio 运行

运行verdaccio.png

在浏览器中输入http://localhost:4873/ 就可以进入页面,现在我们的私库地址就是http://localhost:4873/

verdaccio-web.png

配置 verdaccio

verdaccio 的配置信息都在 config.yaml 中,它的存放目录可以在 verdaccio 运行时的第一行看到

运行verdaccio.png

打开config.yaml在最后一行新增配置,用于支持远程访问:

listen: 0.0.0.0:4873

现在可以查看自己的 ip 地址,得到有 ip 地址的私库链接

  1. win + r 输入cmd 回车,输入ipconfig查看ip地址

ip地址.png

  1. 得到私库链接 172.xx.xx.xx:4873,可以用该链接打开页面

私库链接.png

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:
  taobao:
    url: https://registry.npmjs.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

修改语言

# 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

进程守护

运行成功后为了避免不小心将verdaccio的进程关掉,我们需要安装守护进程的工具:pm2forever

如果你安装了 nvm 进行node的版本控制,pm2可能运行不成功(状态会为stopped),出现这种情况请使用forever, 这里介绍这两种工具的安装

pm2

安装

npm install pm2 -g

运行 verdaccio

pm2 start verdaccio

statusonline 就表示运行成功了

pm2-01.png

常用pm2命令

pm2 start app.js          # 启动 app.js
pm2 stop app.js 	  # 停止 <app_name|namespace|id|'all'|json_conf>
pm2 restart app.js        # 重启 <app_name|namespace|id|'all'|json_conf>
pm2 delete app.js         # 删除 <app_name|namespace|id|'all'|json_conf>
pm2 reload app.js         # 重新加载 app.js
pm2 kill	          # 杀死所有进程

forever

安装

npm install forever -g

运行

cd C:\Users\Dell\AppData\Roaming\nvm\v14.15.0\node_modules\verdaccio\build\lib
forever start cli.js

forever.png

如果觉得每次找目录麻烦,可以写一个脚本,每次启动运行脚本就可以了

cd /c/Users/Dell/AppData/Roaming/nvm/v14.15.0/node_modules/verdaccio/build/lib
forever start cli.js
exit

常用命令

forever list 		    # 查看运行的应用
forever start  cli.js       # 启动脚本    
forever stop  cli.js        # 停止脚本 Id|Uid|Pid|Index|Script
forever stopall             # 停止所有脚本
forever restart  cli.js     # 重启脚本
forever restartall          # 重启

本地使用

在本地使用很简单,只需要配置 npm 镜像源为私库地址就可以了

镜像源的设置

先来介绍一下有关镜像源设置的命令

镜像源的查看

npm get registry

如果你安装了 cnpm ,查看 cnpm的镜像源命令如下:

cnpm get registry

镜像源的修改

npm config set registry <url>

修改cnpm的镜像源:

cnpm config set registry <url>

安装nrm

nrm提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址

对于镜像源的切换,我们使用nrm更为方便

不过上述步骤在某些时候还是不够方便,我们来尝试使用nrm切换镜像源

在本地win + r 打开命令行工具进行安装

安装nrm.png

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

查看镜像源地址.png

这时候如果出现以下错误:

nrm报错.jpg

找到 cli.js并修改第17行为以下代码:

// const NRMRC = path.join(process.env.HOME, '.nrmrc');
const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');

镜像源地址的添加

使用 nrm add 添加镜像源地址

// nrm add <registry> <url>
nrm add verdaccio http://172.56.xx.xxx:4873/

添加镜像源.png

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

验证镜像源添加成功.png

使用 verdaccio 镜像源 nrm use verdaccio

使用镜像源.png

现在我们使用npm i就会优先从私库中下载,如果私库中没有相应的包,将会从其他镜像源下载(taobaonpmyarn

nrm常用命令

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

发布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

发布包.png

现在已经发布成功了

发布成功.png

测试

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

  1. 安装包
npm i npm-test01

安装包.png

  1. 使用包

使用包.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": {
    "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/