开源许可证声明¶
许可证声明是针对随附它们的客户端独立生成的:
- Web 构建会在
index.html旁边生成third-party-licenses.json。设置页面会加载该静态文件,因此同一产物适用于托管 Web、通过npx t3打包的客户端以及桌面端。 - 移动端 Metro 配置会在每次开发、原生或无线(over-the-air)JavaScript 打包前生成一个被忽略的虚拟模块。移动端仅在许可证屏幕打开时加载并解码该模块,因此在普通的应用启动过程中,声明文本不会占用内存。它也不需要网络请求。
这两条路径都不依赖于所连接的环境或 RPC。
构建收集的内容¶
生成器会跟踪已安装的生产依赖和可选依赖,包括工作区包的依赖,并省略第一方 @t3tools/* 包。Web 清单从 Web、服务器和桌面包清单开始。移动端清单从移动端包清单开始。在 Web 打包过程中,生成器还会检查已生成的模块 ID,以发现打包的 npm 导入在包清单中缺失的情况。
移动端清单刻意遵循由 Expo 和 React Native 声明的完整生产依赖闭包。这种做法虽然保守,且可能包含最终 JavaScript 包中不存在的构建工具,但它避免了在平台打包方式变化时遗漏某个声明。
当收集到的包没有可分发的许可证标识符,或不包含许可证或许可证声明文本时,构建将失败。生成的声明使用固定版本的 SPDX 许可证列表中的许可证模板,这些模板提交在 third-party-licenses/spdx/ 下。构建永远不会去获取它们,因此网络抖动不会导致构建失败。当某个配置的模板缺失时,构建会失败;请运行 vp run licenses:sync 下载它,然后提交新文件。
自定义声明与包覆盖¶
仓库级别的 third-party-licenses.config.json 保存了为所有客户端手动维护的例外项。对于改编的图标、字体、媒体、原生模块或任何并非来自 npm 包的其他资源,请在 customNotices 中添加一个条目:
{
"name": "asset-name",
"license": "CC-BY-4.0",
"generatedNotices": [
{
"licenseId": "CC-BY-4.0",
"preamble": ["Asset by Example Author. Changes: converted to MP3."]
}
],
"sourceUrl": "https://example.com/source",
"bundles": ["assets", "web"]
}
每个 generatedNotices 项都指定一个 SPDX 许可证模板,并可通过 copyrights 或简短的 preamble 添加署名和来源信息。对于整合了单独授权代码的软件,多个项会合并为一行。仅当某个以 vendor 方式引入的源码树本身已带有应保留在其旁边的固有许可证文件时,才保留 noticeFile 或 noticeFiles。路径相对于配置文件。bundles 控制哪些生成的清单包含该条目,并提供显示给用户的标签。当两者不同时,请使用 includeInBundles,例如某个可选服务器工具应同时出现在两个客户端清单中,但并未被打包到任一客户端中。
agent-device 和 expo-device-hub 的自定义声明从 安装器固定版本 获取其版本。请将它们的包名保留在配置中;它们的版本无需手动更新。
仅当已安装的 npm 归档省略了其声明或元数据不正确时,才使用 packageOverrides:
{
"name": "package-name",
"version": "1.2.3",
"generatedNotice": {
"licenseId": "MIT",
"copyrights": ["Copyright (c) 2026 Example Author"]
},
"license": "MIT",
"sourceUrl": "https://example.com/package-name"
}
对于包含单独授权代码的包,请使用带有模板数组的 generatedNotices,而不是 generatedNotice。生成器会将每一条声明都包含在该包的行中。
version、license 和 sourceUrl 是可选的。省略 version 会将覆盖应用于该包的每个已安装版本。当同一个 monorepo 中的多个包共享同一份声明时,覆盖项可以使用 repositoryUrl 而不是 name:
{
"repositoryUrl": "https://github.com/example/project",
"generatedNotice": {
"licenseId": "Apache-2.0"
}
}
当两个包声明了相同的规范化仓库和许可证时,生成器还会复用已安装的兄弟包的声明。带名称和版本的覆盖项始终优先于这些仓库回退规则。
@react-grab/cli 覆盖项使用 React Grab 根仓库的 MIT 许可证,因为该 CLI 的 npm 归档同时省略了其 license 字段和许可证文件。请保留该覆盖项,直到已发布的 CLI 包自带这些元数据。
生成的移动端文件位于 apps/mobile/.generated/ 下,并被忽略。不要提交或编辑它们;更新依赖或配置就足以让下一次构建刷新输出。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 t3/t3code