【Unity】使用Verdaccio为Unity Package Manager搭建私有npm包服务器

使用Verdaccio为Unity Package Manager搭建私有npm服务器

重要说明:根据Unity中国团队的反馈,官方对于私有npm服务器的态度还不确定(担心滥用)。现在国际版Unity不限制私有服务器,可以直接使用私有服务器;国内版Unity限制私有服务器, 需要联系Unity团队发放License才能使用私有服务器 。这个License是个独立的License,不是Unity Personal/Pro的那个License。最好仔细评估需求后再决定是否要使用私有npm服务器。
如果私有npm服务器可以在浏览器正常访问,但Unity配置了私有npm服务器之后Console报错 Unable to connect "http://localhost:4873" ,则表明需要申请License。

版本需求

  • Unity 2019.1.0+
  • Node.js 10.0+
  • Verdaccio 4.5.0+

1. 使用Verdaccio搭建私有npm服务器


1.1. 安装Node.js

Windows操作系统

Node.js下载页面下载最新LTS版安装包,然后运行安装包进行安装即可。

Ubuntu操作系统

Verdaccio的 4.5.0 及更高版本要求Node.js的版本不低于 10 ,但Ubuntu 20.04的包管理器默认只能安装 8.x 版本的Node.js,所以这里要执行一些额外的命令,不过也很简单。在终端依次执行以下2条命令即可安装Node.js:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

上面第一条命令中的url中的 12 可以替换成 1014 ,对应将要安装的Node.js的版本。12 是LTS版本,没特殊需求的话用LTS版本比较好。

其他Linux版本参考 Node.js安装指令文档


1.2. 安装Verdaccio

Windows操作系统

在命令提示符(或PowerShell)中 以管理员身份 执行以下命令安装Verdaccio:

npm install -g verdaccio

如果命令提示符(或PowerShell)报错提示 无法加载文件xxx,因为在此系统中禁止执行脚本 ,在命令提示符(或PowerShell)中 以管理员身份 执行以下命令,然后再重新执行上面的安装命令:

Set-ExecutionPolicy RemoteSigned

Linux操作系统

在终端中执行以下命令安装Verdaccio:

sudo npm install -g verdaccio

执行命令后,等待安装完成即可。如果终端报错提示 permission denied ,尝试用以下命令代替上面的安装命令:

sudo npm install -g verdaccio --unsafe-perm=true --allow-root

1.3. 启动Verdaccio服务器

在终端(或命令提示符或PowerShell)中执行以下命令启动Verdaccio服务器:

verdaccio

Verdaccio启动后不会返回交互窗口,而是会一直打印运行日志,直到进程结束。日志的起始几行会说明当前服务器的配置文件位置以及访问地址。如下图所示:

Verdaccio运行状态

启动完成后,在浏览器中访问私服地址(本例中是 http://localhost:4873/ ),可看到如下页面:

Verdaccio私服首页

至此,私有npm服务器的搭建完成。Verdaccio的更多配置方法和高级用法,可以参考官方发布的 Verdaccio配置文档


2. 将自己的Unity工具发布到私有npm服务器


2.1. 在本地创建并发布Unity Package

2.1.1. 创建新的包

首先需要在Unity的Package Manager中安装 Package Development 包,后续的自建包的管理过程依赖此包。

Package Development包

安装好 Package Development 包后,在Package Manager窗口的左上角 加号菜单 中会多出一个 Create Package… 选项。

Create Package按钮

点击 Create Package… ,在出现的输入框中输入自己的包名(以MyPackage为例,后同),然后点击 Create 按钮,即可完成创建。

创建新包

2.1.2. 配置包的Manifest信息

等待Unity导入新包完成后,Project窗口的Packages文件夹中会多出一个 MyPackage 文件夹,选中文件夹中的 package.json 文件,即可在Inspector窗口编辑包的manifest信息。包的manifest信息中主要包含了包的 唯一标识名称显示名称版本号类型支持的最低Unity版本简要说明依赖项可见性

包Manifest信息

其中包的 类型 会影响包在编辑器中的可见性,但Unity文档中未对此项做出说明,可以在设置时将包的 可见性(Visibility in Editor) 设为 总是可见(Always Visible) 。如果不小心隐藏了包,可以在Package Manager窗口中找到该包,然后点击窗口右下角的 笔形按钮 打开包的manifest信息编辑窗口重新设置可见性。

更详细的包配置说明,可以参考官方发布的包Manifest文档

2.1.3. 将包发布到本地

配置好包信息后,即可将自己的代码和资源文件按类型放置到 MyPackage 文件夹下的对应文件夹中。

包开发完成后,可以在Package Manager窗口中选中包,通过窗口底部的按钮对包进行 测试验证移除编辑信息发布 。点击 发布 按钮,即可将包在本地发布为tarball压缩包。发布成功后Console会输出tarball压缩包所在文件夹的路径。

包管理主页

tarball包文件


2.2. 将本地的Unity Package发布到私有npm服务器

2.2.1. 登录到私有npm服务器

在向私服发布包前,要先登录到私服。如果没有登录过,可以在终端执行下面的命令,然后按提示依次输入 用户名密码邮箱 即可完成登录:

npm adduser --registry http://localhost:4873

登录成功后,终端会输出提示信息:

Logged in as your_name on http://localhost:4873/.

2.2.2. 将包发布到私有服务器

将发布得到的tarball解压,然后在终端中进入包文件夹的跟目标(和package.json同级),之后在终端中执行以下命令即可将包发布到私服:

npm publish --registry http://localhost:4873

执行命令后终端输出包信息,最后一行会显示包的名称和版本:

+ [email protected]

注意,一定不要忘记加 --registry http://localhost:4873 参数,否则会将包发布到公共的npm服务器上(如果没有登录则会发布失败)。如果不小心将包发布到了公共npm服务器上,可以在 24 小时内删除(Verdaccio私服不限制删除)。删除已发布的包的命令是:

npm unpublish --force --registry http://localhost:4873

发布完成后,刷新本地服务器主页,可以看到包已经在主页列出。点击包名,可以查看更详细的信息。

MyPackage条目


3. 配置Unity工程从私有npm服务器加载package

为了避免干扰,首先把通过Package Manager创建的本地的 MyPackage 从项目中移除。


3.1. 向Unity编辑器注册私有npm服务器

打开Unity工程包配置文件 manifest.json (工程根目录/Packages/manifest.json),在其中添加 scopedRegistries 属性,如下所示:

{
  "scopedRegistries": [
    {
      "name": "My Registry",
      "url": "http://localhost:4873",
      "scopes": [
        "com.mycompany"
      ]
    }
  ],
  "dependencies": {
    ...
  }
}

上面的配置中, url 是私有npm服务器的地址, scopes 用于包名匹配,暂时没有发现 name 属性的用途。注意 scopedRegistriesscopes 的类型,是数组。

关于包名匹配的详细说明,可以参考官方的 私有包服务器文档


3.2. 从私有npm服务器安装包

完成上一步的注册后,打开Unity的Package Manager窗口,将包的筛选条件选为 All packages ,在 Advanced 菜单中启用 Show preview packages (如果发布包前对包进行过验证,则无需启用此项)。等包列表刷新完成后,可以在列表中找到 MyPackage ,此后可以像使用其他由Unity发布的包一样使用自己的包。

从私服加载的MyPackage

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章