能否在解决方案级别而非各项目单独添加BannedSymbols.txt?
解决方案级统一配置BannedApiAnalyzers的实现方法
完全不用挨个项目手动加包改配置,有两种可直接落地的方案,适配.NET Framework 4.x传统项目结构,哪怕解决方案有上百个项目也能一次配置全局生效。
方案1:使用MSBuild原生Directory.Build.props全局导入(推荐,适配VS2017及以上版本)
这是MSBuild内置的原生机制,会自动把根目录配置文件的规则应用到所有子目录下的C#项目,没有额外侵入性。
操作步骤:
- 在.sln解决方案文件所在的根目录,新建名为
Directory.Build.props的XML文件 - 文件里统一写好分析器引用、规则集配置、禁用API清单路径,所有项目会自动继承这些配置,不用单独修改每个.csproj
- 把共用的规则集文件
.ruleset、禁用API清单BannedSymbols.txt都放在解决方案根目录,后续只需要维护这一份文件就行
配置示例:
<Project> <PropertyGroup> <!-- 开启编译、实时编辑阶段的分析器执行 --> <RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild> <RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis> <!-- 全局引用根目录下的统一规则集 --> <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)GlobalBannedRules.ruleset</CodeAnalysisRuleSet> </PropertyGroup> <ItemGroup> <!-- 全局引入BannedApiAnalyzers包,所有项目自动加载,不用逐项目装NuGet --> <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" PrivateAssets="all" /> <!-- 全局引用统一的禁用API清单文件 --> <AdditionalFiles Include="$(MSBuildThisFileDirectory)BannedSymbols.txt" Link="BannedSymbols.txt" /> </ItemGroup> </Project>
注意:如果是用VS2015及更早版本的传统.NET Framework项目,不支持自动识别Directory.Build.props,直接用方案2即可。
方案2:自定义全局导入目标文件(适配老版本开发环境)
如果开发环境版本太老不支持自动读取Directory.Build.props,可以用自定义Props+全局Import的方式实现:
- 在解决方案根目录新建
build文件夹,放入写好统一配置的GlobalAnalyzerConfig.props文件,配置内容和方案1的示例一致 - 配置MSBuild全局Import规则,在机器级MSBuild配置文件里加一行导入语句,指向你写好的全局配置文件,之后本机加载的所有C#项目都会自动应用配置
- 如果不想改机器级配置,也可以把这些配置打包成内部自用的NuGet包,将BannedApiAnalyzers设为包依赖,把规则文件、禁用API清单都打包进NuGet,再配置解决方案的包管理规则,让所有项目默认引用这个内部包,后续新增项目也会自动带上分析器配置。
配置验证
配完不用重启VS,等项目加载完成后,随便找个项目写入你在BannedSymbols.txt里标记为禁用的API,要是能正常弹出分析器警告,就说明全局配置生效了。
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

