FxCop, исключить правило из сборки (но использовать его для других сборок)


Я хотел бы исключить CA1822: MarkMembersAsStatic из сборки CoreTest, поскольку методы теста NUnit не могут быть преобразованы в статические методы, поскольку NUnit не будет выполнять их, если я это сделаю. В других ассамблеях я хотел бы иметь это правило, поскольку я нашел его ценным.

Если это возможно, я не люблю добавлять SuppressMessage к каждому тестовому методу, так как у меня их много, и это просто загромождает файл.

Это XML-файл правила FxCop:

<?xml version="1.0" encoding="utf-8"?>
<FxCopProject Version="1.35" Name="Foo, Release">
 <ProjectOptions>
  <SharedProject>True</SharedProject>
  <Stylesheet Apply="False">http://www.gotdotnet.com/team/fxcop//xsl/1.35/FxCopReport.xsl</Stylesheet>
  <SaveMessages>
   <Project Status="None" NewOnly="False" />
   <Report Status="Active" NewOnly="False" />
  </SaveMessages>
  <ProjectFile Compress="True" DefaultTargetCheck="True" DefaultRuleCheck="True" SaveByRuleGroup="" Deterministic="True" />
  <EnableMultithreadedLoad>True</EnableMultithreadedLoad>
  <EnableMultithreadedAnalysis>True</EnableMultithreadedAnalysis>
  <SourceLookup>True</SourceLookup>
  <AnalysisExceptionsThreshold>10</AnalysisExceptionsThreshold>
  <RuleExceptionsThreshold>1</RuleExceptionsThreshold>
  <Spelling Locale="en-us" />
  <VersionAware>False</VersionAware>
  <OverrideRuleVisibilities>False</OverrideRuleVisibilities>
  <CustomDictionaries SearchFxCopDir="True" SearchUserProfile="True" SearchProjectDir="True" />
  <SearchGlobalAssemblyCache>False</SearchGlobalAssemblyCache>
  <DeadlockDetectionTimeout>120</DeadlockDetectionTimeout>
 </ProjectOptions>
 <Targets>
  <AssemblyReferenceDirectories>
   <Directory>$(ProjectDir)/Library/EPiServer CMS/5.2.375.7/</Directory>
   <Directory>$(ProjectDir)/Foo.Plugin/bin/Release/</Directory>
  </AssemblyReferenceDirectories>
  <Target Name="$(ProjectDir)/Foo.Core/bin/Release/Foo.Core.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.CoreTest/bin/Release/Foo.CoreTest.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.Example/bin/Foo.Example.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.Web.WebForms/bin/Release/Foo.Web.WebForms.dll" Analyze="True" AnalyzeAllChildren="True" />
 </Targets>
 <Rules>
  <RuleFiles>
   <RuleFile Name="$(FxCopDir)RulesDesignRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesGlobalizationRules.dll" Enabled="True" AllRulesEnabled="False">
    <Rule Name="AvoidDuplicateAccelerators" Enabled="True" />
    <Rule Name="DoNotHardcodeLocaleSpecificStrings" Enabled="True" />
    <Rule Name="SetLocaleForDataTypes" Enabled="True" />
    <Rule Name="SpecifyCultureInfo" Enabled="True" />
    <Rule Name="SpecifyIFormatProvider" Enabled="True" />
    <Rule Name="SpecifyMessageBoxOptions" Enabled="True" />
   </RuleFile>
   <RuleFile Name="$(FxCopDir)RulesInteroperabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesMobilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesNamingRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesPerformanceRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesPortabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesSecurityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)RulesUsageRules.dll" Enabled="True" AllRulesEnabled="True" />
  </RuleFiles>
  <Groups />
  <Settings />
 </Rules>
 <FxCopReport Version="1.35" />
</FxCopProject>

Любые идеи о том, как это можно сделать самым удобным способом?

1 2

1 ответ:

Невозможно использовать отдельные наборы правил в рамках одного запуска FxCop. Для решения проблемы метода тестирования CA1822 я обычно создаю два отдельных проекта FxCop: один, который включает CA1822 для обычных сборок, и один, который исключает CA1822 для тестовых сборок.

Если вы используете функцию анализа кода, интегрированную в некоторые выпуски Visual Studio для группы разработчиков, вы можете применить к каждой сборке свой набор правил. Это поддерживается, потому что инструмент в конечном итоге работает fxcopcmd.exe отдельно для каждой сборки, а не потому, что он использует некоторые более сложные конфигурации для поддержки нескольких наборов правил в рамках одного запуска.