You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#项目/解决方案中拦截指定依赖并触发构建错误?

解决MSBuild检测特定传递依赖并触发构建错误的问题

问题背景

需要在解决方案构建阶段拦截特定库的引用(包括显式引用和传递依赖),触发构建错误。当前显式依赖检测逻辑正常,但检测传递依赖时,使用%(PackageDependencies)的Version元数据始终为空,导致检测失效。

现有配置的问题

PackageDependencies项的Version元数据仅存储依赖约束(如版本范围),而非实际解析后的具体版本,因此无法用来精确匹配特定版本的传递依赖。

解决方案

使用ResolvedPackageDependencies项集合替代PackageDependencies,该集合包含所有已完成解析的包(包括传递依赖),且带有准确的已解析Version元数据。同时保留原有的PackageReference检测逻辑,覆盖显式引用场景。

修改后的配置代码

<!-- Directory.Build.targets -->
<Project>
  <Target Name="BlockForbiddenPackages" AfterTargets="ResolvePackageDependenciesForBuild">
    <!-- 检测显式引用的禁止包 -->
    <Error Code="420" 
           Text="禁止使用的包引用: %(PackageReference.Identity):%(PackageReference.Version)" 
           Condition="'%(PackageReference.Identity)' == 'Microsoft.AspNetCore.Mvc.Abstractions' and '%(PackageReference.Version)' == '2.2.0'" />

    <!-- 检测传递依赖的禁止包 -->
    <Error Code="420" 
           Text="禁止使用的传递依赖: %(ResolvedPackageDependencies.Identity):%(ResolvedPackageDependencies.Version)" 
           Condition="'%(ResolvedPackageDependencies.Identity)' == 'Microsoft.AspNetCore.Mvc.Abstractions' and '%(ResolvedPackageDependencies.Version)' == '2.2.0'" />
  </Target>
</Project>

关键说明

  • ResolvedPackageDependencies:MSBuild在依赖解析完成后生成的项集合,包含项目最终会引入的所有包(含传递依赖),其Version字段为实际解析后的具体版本,可精确匹配目标版本。
  • AfterTargets="ResolvePackageDependenciesForBuild":确保目标在依赖解析完成后执行,保证ResolvedPackageDependencies已填充完整数据。

内容的提问来源于stack exchange,提问作者Morgan Pizzini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:46:20