详解Unity3D packmanager的scoped registry
Table of Contents
核心概念:一句话概括
Scoped Registry(作用域注册表) 是一个自定义的包服务器地址,你可以告诉 Unity Package Manager:“当我要找某个特定前缀的包时,不要再去 Unity 的官方源找了,请去我指定的这个私人地址找。”
为什么需要 Scoped Registry?(解决的问题)
在 Scoped Registry 出现之前,如果你想使用非 Unity 官方提供的包(比如公司内部的工具包、第三方供应商的插件、或自己团队开发的共享模块),通常有几种麻烦的方式:
- 直接导入
.unitypackage文件:难以更新、版本控制混乱、无法清晰地管理依赖。 - 使用 Git URL:在 Package Manager 里直接链接到 Git 仓库。这虽然可以,但不够规范,并且对私有仓库的权限管理比较麻烦。
- 手动复制文件:最原始的方法,维护起来是噩梦。
这些方法都不够优雅,也不利于团队协作和持续集成。
Scoped Registry 的诞生就是为了像管理官方包一样,来管理这些“第三方”或“私人”的包。 它让 Package Manager 从一个只能连接 Unity 官方商店的工具,变成了一个可以连接多个包源的、更通用的依赖管理工具。
它是如何工作的?
Scoped Registry 基于 npm 的包注册表协议。你配置两个核心信息:
- 注册表地址:包的服务器地址。例如:
- 公司内部搭建的 npm registry(如 Verdaccio、Azure Artifacts 等)。
- 第三方服务提供的地址(如 OpenUPM 的注册表)。
- 作用域:一个或多个包名的前缀。它用来“过滤”或“限定”这个注册表负责哪些包。
工作流程示例:
假设你的公司叫 “AwesomeStudio”,你们将所有内部工具包的名字都命名为 com.awesomestudio.xxx。
-
配置 Scoped Registry:
- 名称:
AwesomeStudio Internal - URL:
https://packages.awesomestudio.com - 作用域:
com.awesomestudio
- 名称:
-
当你在 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 编辑器中通过界面设置(推荐新手)
- 打开
Edit -> Project Settings -> Package Manager - 在 Scoped Registries 区域,点击 + 号。
- 填写信息:
- Name: 给这个注册表起个容易识别的名字(如 “My Company”, “OpenUPM”)。
- URL: 注册表的服务器地址。
- Scope(s): 包的作用域前缀(如
com.mycompany)。可以添加多个,每行一个。
- 点击 Apply。
之后回到 Package Manager 窗口,在顶部选择 My Registries 或 All 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 的完美典范。
- 它的注册表地址是:
https://package.openupm.com - 它上面的包通常有
com.openupm或其他各种作用域(如com.littlebigfun等)。 - 当你将 OpenUPM 的注册表添加到项目后,你就可以直接在 Unity Package Manager 里搜索、浏览和安装成千上万个社区包,体验和安装官方包一模一样。
总结
| 特性 | 描述 |
|---|---|
| 是什么 | 一个指向自定义包服务器的配置,并指定其负责的包名范围。 |
| 目的 | 统一、规范地管理非 Unity 官方的包(公司内部包、社区包)。 |
| 核心原理 | 通过包名的作用域 来路由请求,让 Package Manager 知道去哪个服务器找包。 |
| 优势 | 版本管理清晰、依赖解析自动化、易于团队共享和 CI/CD。 |
简单来说,Scoped Registry 极大地扩展了 Unity Package Manager 的生态能力,让包管理变得真正专业和现代化。