C# 依赖许可证收集
Manifest.json 覆盖内核锁定依赖图中的包(保守包含构建工具),以及三个隐式 NativeAOT 运行时/编译器包。每个包保留原始 .nuspec、完整许可证正文的路径、版权/许可证声明、NuGet 来源、包归档 SHA256/SHA512 和锁文件内容哈希。运行时原包的 THIRD-PARTY-NOTICES.TXT 等声明一并保留。
Upstream 保存来自官方仓库固定 commit/tag 的补充许可证;来源与预期 SHA256 固定在 ../../LicenseSources.json。NuGet 仅声明 MIT/BSD 表达式时,不能把表达式当作许可证正文,因此额外收集上游完整文本。AngleSharp.Css 包未标出源码 commit,补充文本来自单独固定的官方 commit;包自身的版权与 MIT 声明仍原样保留。Cosmos 的部分 vendored 组件没有标出精确上游版本,相关补充文本的来源边界逐项写入清单,不冒称源码版本完全一致。
Documents、Fonts、Boot 保留网站资源、字体、Limine 与固件的既有许可文本;Upstream/Cosmos/Credits.md 保存 Cosmos 的完整第三方致谢。该目录包含某个组件的许可证,不代表该组件通过 NativeAOT 修剪后一定仍存在,或已经在来宾中实际执行。
在完成项目依赖恢复和既有工具下载后,可离线重建并校验:
python Tools/CSharpBoot/CollectLicenses.py
官方补充文本未存在时使用 --Fetch,脚本只允许固定官方 GitHub raw URL,下载后校验锁定的 SHA256。可用 --NuGetCache 路径 指定已恢复的包缓存。脚本只读取缓存,不修改缓存、不构建项目,也不替换不同内容的既有许可证文件。
NuGet 的锁文件 contentHash 是 NuGet 规范化内容哈希,与已签名 .nupkg 归档的原始 SHA512 可能不同。脚本分别核对锁文件与 .nupkg.metadata、归档与其 SHA512 侧文件,并在清单里分别记录两种值,不将它们混为同一哈希。