SuperAPI AI 工具集

extension-points

通用与其它

查看项目

更新于 10-16 00:05

技能介绍

用途:说明 MSBuild 管道如何为 SDK、NuGet 包、仓库和用户提供自定义逻辑注入的钩子,并给出审查与实现时的规则。

主要能力与用法:

  • CustomBefore/CustomAfter 钩子:每个主要 .targets 定义导入钩子,默认路径含版本号;应检查 Exists(),并用分号追加而非覆盖属性以串联多个钩子。
  • 通配符导入目录:MSBuild 按字母序导入扩展目录内文件;关键路径为 $(MSBuildUserExtensionsPath)(用户级)、$(MSBuildExtensionsPath)(机器级)、$(MSBuildProjectExtensionsPath)(obj/,项目级,NuGet)。文件名可用数字前缀排序,如 01-first.props。
  • 导入门控控制属性:每个通配符导入由布尔属性控制,如 ImportDirectoryBuildProps、ImportDirectoryBuildTargets、ImportProjectExtensionProps、ImportProjectExtensionTargets、ImportByWildcardBefore*、ImportByWildcardAfter*。
  • NuGet 包构建扩展布局:包通过 build/ 或 buildTransitive/ 注入逻辑,文件名必须与包 ID 完全一致;build/ 只影响直接消费者,buildTransitive/ 影响整个依赖链;props 早导入,targets 晚导入;转发链 buildTransitive → build → shared。buildTransitive/<tfm>/ 转发器需包含 TFM 段,且应从文件自身文件夹推导,不能用 $(TargetFramework)。
  • 源树与打包布局:.nuspec 的 <file src/target> 映射、.csproj 的 <PackagePath> 元数据及 SDK 约定会在打包时重塑布局。审查时先查项目目录及直接父目录的 *.nuspec 与 .csproj 的 PackagePath,只在源树与投影包布局都缺失目标路径时才报错。
  • 导入保护模式:用保护属性(如 MicrosoftCommonPropsHasBeenImported)确保 .props 已导入;Directory.Build.props 只发现最近一个,嵌套层级需显式导入父级。
  • 自定义扩展点:定义 CustomBefore/CustomAfter 属性并带 Exists() 条件导入,通过 DependsOnTargets 组织 Before/Core/After 目标。

限制与陷阱:可选导入缺少 Exists() 会导致构建失败,但已发布包 build/<tfm>/ 与 buildTransitive/<tfm>/ 内的导入属于包契约,不应加守卫也不应报错;覆盖 Custom* 属性会丢失先前钩子;包文件名不匹配包 ID 会静默跳过导入。