详解Unity3D packmanager的scoped registry

Table of Contents

核心概念:一句话概括

Scoped Registry(作用域注册表) 是一个自定义的包服务器地址,你可以告诉 Unity Package Manager:“当我要找某个特定前缀的包时,不要再去 Unity 的官方源找了,请去我指定的这个私人地址找。


为什么需要 Scoped Registry?(解决的问题)

在 Scoped Registry 出现之前,如果你想使用非 Unity 官方提供的包(比如公司内部的工具包、第三方供应商的插件、或自己团队开发的共享模块),通常有几种麻烦的方式:

  1. 直接导入 .unitypackage 文件:难以更新、版本控制混乱、无法清晰地管理依赖。
  2. 使用 Git URL:在 Package Manager 里直接链接到 Git 仓库。这虽然可以,但不够规范,并且对私有仓库的权限管理比较麻烦。
  3. 手动复制文件:最原始的方法,维护起来是噩梦。

这些方法都不够优雅,也不利于团队协作和持续集成。

Scoped Registry 的诞生就是为了像管理官方包一样,来管理这些“第三方”或“私人”的包。 它让 Package Manager 从一个只能连接 Unity 官方商店的工具,变成了一个可以连接多个包源的、更通用的依赖管理工具。


它是如何工作的?

Scoped Registry 基于 npm 的包注册表协议。你配置两个核心信息:

  1. 注册表地址:包的服务器地址。例如:
    • 公司内部搭建的 npm registry(如 Verdaccio、Azure Artifacts 等)。
    • 第三方服务提供的地址(如 OpenUPM 的注册表)。
  2. 作用域:一个或多个包名的前缀。它用来“过滤”或“限定”这个注册表负责哪些包。

工作流程示例:

假设你的公司叫 “AwesomeStudio”,你们将所有内部工具包的名字都命名为 com.awesomestudio.xxx

  1. 配置 Scoped Registry

    • 名称AwesomeStudio Internal
    • URLhttps://packages.awesomestudio.com
    • 作用域com.awesomestudio
  2. 当你在 Package Manager 中搜索或安装包时

    • 如果你想安装 com.unity.cinemachine,Package Manager 会判断这个包的前缀是 com.unity,所以它会去 Unity 的官方注册表 查找和下载。
    • 但如果你想安装 com.awesomestudio.audio-manager,Package Manager 会判断这个包的前缀 com.awesomestudio 匹配了你配置的作用域。于是,它就会转向你配置的私人地址 https://packages.awesomestudio.com 去查找和下载这个包。

这样一来,公共包和私人包就完美地融合在了同一个 Package Manager 界面中,管理起来非常方便。


如何设置 Scoped Registry?

有两种主要方式:

方法一:在 Unity 编辑器中通过界面设置(推荐新手)

  1. 打开 Edit -> Project Settings -> Package Manager
  2. Scoped Registries 区域,点击 + 号。
  3. 填写信息:
    • Name: 给这个注册表起个容易识别的名字(如 “My Company”, “OpenUPM”)。
    • URL: 注册表的服务器地址。
    • Scope(s): 包的作用域前缀(如 com.mycompany)。可以添加多个,每行一个。
  4. 点击 Apply

之后回到 Package Manager 窗口,在顶部选择 My RegistriesAll packages,你就可以看到来自新注册表的包了。

方法二:直接编辑 manifest.json 文件(推荐高级用户和CI/CD)

Unity 项目的包配置都保存在 项目根目录/Packages/manifest.json 文件中。设置 Scoped Registry 实际上就是修改这个文件。

{
  "scopedRegistries": [
    {
      "name": "AwesomeStudio Internal",
      "url": "https://packages.awesomestudio.com",
      "scopes": [
        "com.awesomestudio"
      ]
    },
    {
      "name": "OpenUPM",
      "url": "https://package.openupm.com",
      "scopes": [
        "com.openupm"
      ]
    }
  ],
  "dependencies": {
    "com.unity.cinemachine": "2.8.9",
    "com.awesomestudio.audio-manager": "1.0.0",
    "com.openupm.some-package": "2.1.3"
  }
}

这种方式非常适合通过 Git 来同步团队配置,或者在 CI/CD 流程中自动配置项目。


一个著名的例子:OpenUPM

OpenUPM 是一个社区维护的 Unity 包平台,它就是使用 Scoped Registry 的完美典范。

  1. 它的注册表地址是:https://package.openupm.com
  2. 它上面的包通常有 com.openupm 或其他各种作用域(如 com.littlebigfun 等)。
  3. 当你将 OpenUPM 的注册表添加到项目后,你就可以直接在 Unity Package Manager 里搜索、浏览和安装成千上万个社区包,体验和安装官方包一模一样。

总结

特性 描述
是什么 一个指向自定义包服务器的配置,并指定其负责的包名范围。
目的 统一、规范地管理非 Unity 官方的包(公司内部包、社区包)。
核心原理 通过包名的作用域 来路由请求,让 Package Manager 知道去哪个服务器找包。
优势 版本管理清晰、依赖解析自动化、易于团队共享和 CI/CD。

简单来说,Scoped Registry 极大地扩展了 Unity Package Manager 的生态能力,让包管理变得真正专业和现代化。

kumakoko avatar
kumakoko
pure coder
comments powered by Disqus