一、Verdaccio说明

Unity 自定义PackageManager服务器,解决外网访问Package的问题,使用Verdaccio解决

服务器配置 | Verdaccio

二、安装相关程序

1. 老的办法已经失效

1
2
3
4
5
6
7
8
9
10
# 安装NodeJs
curl -sL https://rpm.nodesource.com/setup_16.x | bash -
yum install nodejs

# 检查
nodejs -v
npm -v

# 如果检查正确,继续安装verdaccio
npm install --global verdaccio

安装过程中,如果是CentOS7,则在安装NodeJs18的时候,会有不兼容的问题,这里的使用了NodeJs16的版本

详情参考:

NodeJS 18 revert to building on CentOS 7, RHEL 7, Ubuntu Bionic 18.04, other other LTS distros · Issue #43246 · nodejs/node (github.com)

继续在 centos7 中使用 nodejs18 · Issue #64 · luckyyyyy/blog (github.com)

2. Update 2023-11安装方法

老的安装可能会有问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
================================================================================
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
================================================================================

SCRIPT DEPRECATION WARNING


This script, located at https://deb.nodesource.com/setup_X, used to
install Node.js is deprecated now and will eventually be made inactive.

Please visit the NodeSource distributions Github and follow the
instructions to migrate your repo.
https://github.com/nodesource/distributions

The NodeSource Node.js Linux distributions GitHub repository contains
information about which versions of Node.js and which Linux distributions
are supported and how to install it.
https://github.com/nodesource/distributions


SCRIPT DEPRECATION WARNING

================================================================================
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
================================================================================

TO AVOID THIS WAIT MIGRATE THE SCRIPT
Continuing in 60 seconds (press Ctrl-C to abort) ...

具体参考 https://github.com/ddev/ddev/issues/5363

所以最安全的办法还是直接手动安装
https://nodejs.org/en/about/previous-releases 中找到16版本

1
2
3
4
5
6
7
8
9
10
11
12
wget https://nodejs.org/dist/v16.13.2/node-v16.13.2-linux-x64.tar.xz

# 解压
# xz 找不到命令需要执行 yum install xz.x86_64 -y
xz -d node-v16.13.2-linux-x64.tar.xz

# 如果是Tar
# tar xvf node-v16.13.2-linux-x64.tar

# 移到文件夹
mv node-v16.13.2-linux-x64 /usr/local/nodejs

1
2
3
4
5
6
7
8
9
10
11
# 添加下面内容到环境配置里
vi /etc/profile

# 添加环境变量
export PATH=$PATH:'/usr/local/nodejs/bin'

# 重新加载
source /etc/profile

# 查看是否配置正确
node -v

如果没有问题,则表示NodeJs安装成功

三、相关配置

verdaccio运行并不需要root,并且在启动的时候会明确提示不要使用root,可以新建一个专门的用户如upm用于运行verdaccio

说明:这里必须不使用root,不然可能会有各种各样的问题

所以先添加一个专门的服务器用户

1
2
3
4
5
6
sudo useradd -m upm
sudo passwd upm

# 如果已经在root,则把刚下面的verdaccio目录移动到新的用户目录下面
# /home/upm/verdaccio
# 从这里启动

然后再在当前新用户下面进行测试

1
2
3
4
5
6
7
8
9
# 直接在终端运行
verdaccio

# 会出现当前配置的信息
warn --- config file - /home/upm/.config/verdaccio/config.yaml
info --- "crypt" algorithm is deprecated consider switch to "bcrypt". Read more: https://github.com/verdaccio/monorepo/pull/580
info --- plugin successfully loaded: verdaccio-htpasswd
info --- plugin successfully loaded: verdaccio-audit
warn --- http address - http://0.0.0.0:4873/ - verdaccio/5.21.1

可以打开配置文件,进行一些配置

1
vim /home/upm/.config/verdaccio/config.yaml

找到listen配置,打开listen0.0.0.0:4873表示接受所有IP的访问(可根据自己需求配置)

1
2
3
4
5
6
7
8
# 打开IP和端口配置
listen:
# - localhost:4873 # default value
# - http://localhost:4873 # same thing
- 0.0.0.0:4873 # listen on all addresses (INADDR_ANY)
# - https://example.org:4873 # if you want to use https
# - "[::1]:4873" # ipv6
# - unix:/tmp/verdaccio.sock # unix socket

同时在云服务器的防火墙配置中打开

1
2
应用类型	来源	协议	端口	策略 	备注
自定义 0.0.0.0/0 TCP 4873 允许 verdaccio服务

同时,可将配置文件中的max_body_size设置成100M

1
max_body_size: 100mb

具体见:Configuration File | Verdaccio

此时,直接运行

1
verdaccio

然后在浏览器中打开

1
http://your-ip:4873

将会看到verdaccio主页面

四、客户端添加用户

在服务器运行verdaccio的时候,在客户端终端中,添加用户

1
2
3
4
5
6
7
8
# 添加用户
npm adduser --registry http://your-ip:4873/

# 输入用户名密码和邮箱
Username: caidog
Password:
Email: (this IS public) xxx@qq.com
Logged in as meta on http://your-ip:4873/.

然后再检查登录

1
2
3
4
5
npm login --registry http://your-ip:4873

# 输入用户名密码
# 输入邮箱,可与注册不一样
Logged in as caidog on http://your-ip:4873/.

可以在配置文件中设置最大用户数量max_users,如果设置为-1,则表示不让注册

1
2
3
4
5
6
auth:
htpasswd:
file: ./htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
max_users: 5

五、pm2安装

退出 ssh 远程登陆,verdaccio就会停止运行,因此我们使用 forever 或者 pm2 启动

注意:Pm2也要在新的非root账号下启动,不然也可能会有各种问题

目前使用pm2,主要原因是:好看漂亮,功能强大

1
npm install -g pm2

直接使用pm2运行

1
pm2 start `which verdaccio`

则看到以下输出

1
2
3
4
5
6
7
8
9
10
11
12
[upm@VM-24-16-centos /]$ pm2 start `which verdaccio`

[PM2] Spawning PM2 daemon with pm2_home=/home/upm/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/bin/verdaccio in fork_mode (1 instance)
[PM2] Done.
┌─────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ verdaccio │ default │ N/A │ fork │ 17827 │ 0s │ 0 │ online │ 0% │ 10.9mb │ upm │ disabled │
└─────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

网页打开http://your-ip:4873看是否正常

同时,也可以用

1
pm2 show verdaccio 

去查看Log位置等配置,方便对错误进行调试,到此,服务器部分解决完毕

六、客户端发布插件

基本要求

你可以参考Package下面这些Unity自带的包格式,基本有以下要求

  • package以文件夹的形式管理
  • 脚本建议按照Editor和Runtime进行分类
  • package里所有的脚本都需要有一个程序集定义文件Assembly Definition
  • 程序集之间的引用关系必须正确
  • 根目录必须要有一个package.json文件

创建方法

官方文档介绍

Unity - Manual: Assembly definitions (unity3d.com)

基本上就只需要给Editor和Runtime两个文件夹的脚本添加程序集就够了

(1)因为Editor的脚本应该是只在编辑器下生效的,所以我们需要将平台改为只勾选Editor,否则有可能在打包时出错

(2)一些Editor的脚本会引用Runtime的脚本,所以需要对Editor的程序集定义文件引用Runtime的程序集定义文件

(3)如果你的插件引用了其他插件,也需要添加其他插件的程序集引用

(4)在插件根目录创建package.json文件,打开之后,填写包名,版本号,引用的其他package等

全部完成之后上传即可

上传发布

打开PowerShell或者Cmd,如果没有用户,先创建一个用户

1
2
3
npm adduser --registry http://ip:端口

# 输入用户名,密码,邮箱后创建成功

如果有用户,则可以直接登录

1
npm login --registry http://ip:端口

接下来进入到package路径

1
2
3
cd "D:\xxx\xxx"
或者
cd /d d:\xx\xx

使用指令发布

1
npm publish --registry http://ip:端口

每次发布的时候,都要修改版本号,否则会失败

然后在网页上就可以看到当前发布的Package了

七、包的使用方法

在要使用包的项目中,修改项目的manifest.json文件,注册你的服务器地址

打开根目录,找到Packages文件夹下的manifest.json,在dependencies上方加入以下代码

1
2
3
4
5
6
7
8
9
"scopedRegistries": [
{
"name": "CaidogFramework",
"url": "http://ip:端口/",
"scopes": [
"注册的包名前缀如com.caidog",
]
}
],

其中name就是给自定义一个名字

scopes表示包名的前缀,一般来说表示所有者(根据情况统一发布标准),如所有的包都按com.caidog.xxx发布,则这里就是com.caidog

重新回到项目,打开菜单PackageManager,新版本的Unity还可以在这筛选是Unity的包还是自定义服务器的包

八、nginx配置

如果要配置域名跳转,则需要对nginx进行配置

nginx配置文件一般在/etc/nginx/nginx.conf

新加一个80端口的新域名跳转,同时增加最大包Size限制的配置client_max_body_size

1
2
3
4
5
6
7
8
9
10
11
12
13
server{
listen 80;
server_name upm.xxx.com;
index index.php index.html index.htm;
# 注意这里一定要加一个限制,不然在使用域名发布包的时候会碰到MaxSize的限制
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:4873; # 转发到verdaccio
proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

之后

1
2
sudo nginx -t # 检查配置是否正确
sudo systemctl reload nginx # 重新加载配置

九、一些技巧说明

服务器管理

服务器可以使用Docker进行安装verdaccio,这样会让服务器轻量级一些

同时,可以为UPM单独创建一个服务器的用户,用于运行verdaccio

版本管理

一般来说,对于一个通用的包,我们获取的时候他可能是Version 1.2.3类似,但我们在修改之后,放到自己的服务器上的时候,如果再修改版本号,可能导致更新的时候,找不到原来的版本号,所以一般来说,我们可以在最后位使用多位版本号X1000,比如第一次修改,则版本号定义为1.2.3001,第二次修改定义版本号为1.2.3002,如果我们更新了整个包的大版本,比如现在更新为Version 1.2.4,则我们在合并到当前修改版本后, 可以在1.2.4的基础上再上升级,比如1.2.4001`

这样处理会为以后版本升级提供一些方便,仅供参考

用户管理

一般一个公司或者一个小组可以使用同一个用户,在注册用户后,再在配置文件中限制用户注册,或者在配置文件中再配置用户权限等,比如可以让程序进行发布,但是对于美术来说,不让他使用发布功能。

包名处理

包名为了区分,可能增加自己公司或者小组名或者其它的前缀,比如com.xxx.packageName,或者在前面增加下划线等前缀

(1)用于区分自定义包

(2)区分所有者

九、引用参考

Unity 自定义PackageManager服务器 - 知乎 (zhihu.com)

使用高大上的pm2代替forever部署nodejs项目 - 简书 (jianshu.com)

(47条消息) 私有NPM库Verdaccio的使用手册_棋子大叔的博客-CSDN博客_verdaccio 用户管理

企业私有 NPM 搭建及使用 - 知乎 (zhihu.com)

CentOS8 安装Node.js最新版 | 一只大菜狗 (cai.dog)

Unity - Manual: Assembly definitions (unity3d.com)