状态
Accepted(2026-07-12)。
背景
在 Framework 与 Platform 迁移到商业 NuGet 交付后,dotnet restore 成为生产供应链的一部分。若包源、凭据、签名、版本与发布产物不可验证,客户项目面临依赖混淆、凭据泄露、包覆盖或不可复现构建的风险。
决策
十条决策定义该供应链:
- Package Source Mapping——
BitzOrcas.*包仅发布到认证私有 Feed,由 Package Source Mapping 钉定。 - 短期 token——开发机使用 Credential Provider;CI 使用短期工作负载身份或受控 secret。长期 token 与明文凭据绝不进入仓库/模板/镜像/日志。
- 最小权限 token——只读、短期、可撤销,按 Customer/Product/Package Prefix/Version Channel 限定范围。
- 代码签名 + 时间戳——商业包用代码签名证书加可信时间戳签名;发布管线验证签名并记录 SHA-256、Git commit 与不可变版本。
- SBOM/漏洞/许可证——发布前生成并归档 SBOM、依赖漏洞结果、第三方许可证策略结果与 provenance。一个已发布的 PackageId+Version 不可被覆盖。
- 客户 Feed 中无源码——客户 Feed 默认不含
.cs、Embedded Source、公开 Source Link 或公开符号包;调试符号进入认证的内部或客户支持符号服务器。 - 禁止浮动版本——Consumer Solution 禁止浮动版本;使用统一 SDK/BOM 与锁文件还原。升级通过
bitz-upgrade --plan展示兼容性影响。 - 净室发布验证——从空 NuGet 缓存与隔离 consumer 项目起步;ProjectReference、本地绝对 Feed 与产品仓库路径不参与。
- 源生成器打包——作为标准 analyzer/buildTransitive 资产打包;验证
PrivateAssets、诊断与生成输出;生成产物不含商业实现。 - Runbook——Feed 高可用、备份、证书轮换、token 泄露与恶意包事件各有 runbook;一次 Feed 故障不得破坏已部署实例的本地 Runtime License 验证。
后果
一次内部 ProjectReference 构建通过不再等于可消费的商业包——独立的 consumer 契约测试成为发布门禁。并非每个源项目都成为公开包;包产品线按外部接口加独立可用模块来设计,避免浅层包森林。本地绝对 NuGet 源与默认的 IsPackable=false 在迁移期收敛。