9

単一のファイルに含まれている次のコードを検討してください。

namespace Foo
{
    public partial class One
    {
    }
}

namespace Baa
{
    public partial class Two
    {
    }
}

このコードをコンパイルすると、次の 2 つの StyleCop 警告が表示されます。

  • SA1402:FileMayOnlyContainASingleClass
  • SA1403:FileMayOnlyContainASingleNamespace

SA1402 の抑制は期待どおりに機能します。

namespace Foo
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]
    public partial class One
    {
    }
}

namespace Baa
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]        
    public partial class Two
    {
    }
}

残念ながら、SA1403 を抑制することはできないようです。

各クラスの上で次の抑制を試みました(SA1402抑制による):

[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

また、ファイルの先頭とグローバル抑制ファイルの両方で、次のアセンブリ レベルの抑制を試みました (これは賢明な考えではないことに気付きました)。

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

しかし、役に立たない。

だから、私の質問は次のとおりです:StyleCop警告SA1403を抑制するにはどうすればよいですか?

ありがとう、

PS 1 つのファイルに複数の名前空間があると、プログラミングのやり方が悪いということを思い出したいという衝動を抑えてください...

編集 (20121127): Mightymuke の回答に沿って、SourceFileList.

StyleCopOverrideSettingsFileビルドでは、共有ルール ファイルを指すタグを使用します。Mightymuke の提案に沿って、ファイルに以下を追加しました。

  <SourceFileList>
    <SourceFile>MyFileName.cs</SourceFile>
    <Settings>
      <Analyzers>
        <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
          <Rules>
            <Rule Name="FileMayOnlyContainASingleNamespace">
              <RuleSettings>
                <BooleanProperty Name="Enabled">False</BooleanProperty>
              </RuleSettings>
            </Rule>
          </Rules>
        </Analyzer>
      </Analyzers>
    </Settings>
  </SourceFileList>

これもうまくいきませんでした。

ただし、これは設計によるものである可能性があると思います。このタグはプロジェクト レベルよりも高いレベルでは使用できないことを示唆するStyleCop バグ レポートを見つけました。SourceFileList

この情報を念頭に置いてSettings.StyleCop、プロジェクト レベルでファイルを追加しようとしました。

まだ喜びはありません。

StyleCopOverrideSettingsFileタグが他のすべての設定ファイルを無効にしている可能性を現在調べています。これは論理的に思えますが、もしそうなら、私が見た動作は、SourceFileListも使用するビルドで aを使用できないことを意味しますStyleCopOverrideSettingsFile。または、単純にSettings.StyleCopファイル名が間違っているか、間違った場所に配置した可能性があります (csproj ファイルの隣に配置しました)。

編集 (20130425):

結局、私はあきらめました。問題のコードはビジュアル スタジオ テンプレート ファイル (.TT) によって自動生成されたので、テンプレート コードで名前空間を個別のファイルに分割するという追加の作業を行いました。

4

4 に答える 4

3

設定ファイルにファイル リストを作成します。

ドキュメントから:

Now consider a situation where you’d like to disable some additional rules for a
couple of specific files in the project, Class3.cs and Class4.cs. In StyleCop
4.4, this can be accomplished by adding a <SourceFileList> section within the
settings file:
<SourceFileList>
  <SourceFile>Class3.cs</SourceFile>
  <SourceFile>Class4.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="AccessModifierMustBeDeclared">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>

特定のケースでは、次のようになります。

<SourceFileList>
  <SourceFile>YourFile.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="FileMayOnlyContainASingleClass">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
          <Rule Name="FileMayOnlyContainASingleNamespace">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>
于 2012-11-22T20:35:06.683 に答える
0

これが生成されたファイルの場合は、プロジェクト プロパティの [コード分析] セクションで、[生成されたコードから結果を除外する] ボックスをオンにするだけです。ここに画像の説明を入力

于 2020-02-25T12:26:58.473 に答える