如何在NDepend中忽略所有外部程序集?
嗨,完全懂你的烦恼——本来想专心梳理自己的代码,结果一堆外部NuGet包或者系统DLL的规则警告跳出来,像Microsoft.Office那些明明微软自己没遵守接口命名规范,却给我们添了几百条噪音,太闹心了!
你提到已经用了JustMyCode域但没效果,其实NDepend提供了更灵活的方式来批量标记所有外部程序集为NotMyCode,不用手动维护冗长的程序集列表,下面给你一步步说怎么做:
1. 创建自定义NotMyCode查询,自动排除所有外部依赖
打开NDepend的Code Query & Rules Editor,新建一个查询,粘贴下面的CQLinq代码:
// <Name>标记所有外部程序集为NotMyCode</Name> // <Description>自动识别并排除非自有代码的程序集,包括NuGet包、系统DLL等</Description> from assembly in Assemblies where // 排除不是由本地源代码构建的程序集 !assembly.IsBuiltFromSourceCode // 同时排除NuGet包中的程序集 || assembly.IsNuGetPackageAssembly // 可以额外添加特定前缀的系统DLL,比如Microsoft.Office系列 || assembly.Name.StartsWith("Microsoft.Office.") select assembly
右键这个查询,选择Set as a NotMyCode Definition Query——这样NDepend就会把所有匹配到的程序集标记为NotMyCode,后续所有规则分析都会跳过它们。
2. 验证自有代码范围是否正确
为了确保设置生效,你可以跑一个简单的查询来确认哪些是MyCode:
from a in Assemblies where a.IsMyCode select a
检查结果应该只有你自己项目的程序集,没有外部NuGet或系统DLL的影子。
3. 给个别规则补加MyCode过滤(可选但保险)
有些旧规则或者自定义规则可能没默认包含MyCode过滤,你可以直接编辑规则代码,加上IsMyCode条件。比如那个“接口名称应以‘I’开头”的规则,修改后应该是:
// <Name>接口名称应以‘I’开头</Name> from i in Interfaces where i.IsMyCode && !i.Name.StartsWith("I") select i
这样就只会检查你自己写的接口,彻底屏蔽外部代码的干扰。
小提示
如果之后新增了外部NuGet包,这个自定义查询会自动识别并排除它们,不用手动更新列表——是不是比维护精确程序集全名省心多了?
内容的提问来源于stack exchange,提问作者Kasper Bergh
相关产品推荐
相关产品推荐

