如何合并多套.NET Analyzer规则集实现项目级规则覆盖
解决方案
你可以通过以下两种不需要修改NuGet包内文件、也不需要手动引用缓存路径的方式实现规则合并:
方法1:通过NuGet包内置属性引入全局规则集,在本地规则集内完成合并
- 首先确认你公司规则集NuGet包的包ID,假设为
Company.CodeAnalysis.Rulesets,NuGet会自动为其生成对应路径属性$(PkgCompany_CodeAnalysis_Rulesets),属性命名规则为Pkg+包ID将.替换为_,该属性直接指向缓存中该包的根目录。 - 在你的本地自定义规则集文件同目录下,新增一个Directory.Build.props文件(如果已有则直接修改),添加如下配置将NuGet包内规则集所在目录加入规则集搜索路径:
<PropertyGroup> <CodeAnalysisRuleSetDirectories> $(CodeAnalysisRuleSetDirectories); $(PkgCompany_CodeAnalysis_Rulesets)\rulesets <!-- 此处替换为规则集在NuGet包内的实际相对路径 --> </CodeAnalysisRuleSetDirectories> </PropertyGroup>
- 之后在你的本地自定义规则集文件头部添加Include节点,直接写NuGet包内规则集的文件名即可,不需要写全路径:
<RuleSet Name="LocalCustomRules" ToolsVersion="17.0"> <Include Path="Company.Global.ruleset" Action="Default" /> <!-- 此处替换为NuGet内全局规则集的实际文件名 --> <!-- 下面写你自定义的规则覆盖项 --> </RuleSet>
- 最后在你的项目/解决方案属性中,仅指定你本地的自定义规则集即可,会自动合并全局规则和本地覆盖规则。
方法2:编译前动态生成合并规则集(无侵入更灵活)
如果不想修改本地规则集的Include配置,可以通过自定义MSBuild目标在编译前自动合并两套规则:
- 在你的解决方案根目录添加Directory.Build.targets文件,添加如下配置:
<Target Name="MergeRuleSets" BeforeTargets="CoreCompile"> <!-- 定义合并后规则集的临时路径 --> <PropertyGroup> <MergedRuleSetPath>$(IntermediateOutputPath)Merged.ruleset</MergedRuleSetPath> <!-- 此处填写NuGet注入的全局规则集路径,可通过输出MSBuild属性日志拿到注入的CodeAnalysisRuleSet值 --> <GlobalRuleSetPath>$(PkgCompany_CodeAnalysis_Rulesets)\rulesets\Company.Global.ruleset</GlobalRuleSetPath> <!-- 此处填写你的本地自定义规则集路径 --> <LocalRuleSetPath>$(MSBuildThisFileDirectory)Custom.ruleset</LocalRuleSetPath> </PropertyGroup> <!-- 生成合并后的规则集文件 --> <WriteLinesToFile File="$(MergedRuleSetPath)" Overwrite="true" Lines=" <RuleSet Name="MergedRules" ToolsVersion="17.0"> <Include Path="$(GlobalRuleSetPath.Replace('\', '\\'))" Action="Default" /> <Include Path="$(LocalRuleSetPath.Replace('\', '\\'))" Action="Default" /> </RuleSet>" /> <!-- 指定编译使用合并后的规则集 --> <PropertyGroup> <CodeAnalysisRuleSet>$(MergedRuleSetPath)</CodeAnalysisRuleSet> </PropertyGroup> </Target>
- 该方式会自动在编译的中间目录生成合并规则集,不需要修改原有规则集文件,本地规则的优先级高于全局规则,相同规则ID会以最后加载的配置为准。
关于规则集无法识别MSBuild变量的说明
规则集文件本身不属于MSBuild解析范畴,不会自动识别$(MSBuildProjectDirectory)这类变量,所有路径解析逻辑都要放在MSBuild的props/targets文件中处理,不要直接写在ruleset文件里。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

