2012-11-22 12 views
7

Considerate questo codice, che è contenuta all'interno di un unico file:Come si sopprime l'avvertenza StyleCop SA1403?

namespace Foo 
{ 
    public partial class One 
    { 
    } 
} 

namespace Baa 
{ 
    public partial class Two 
    { 
    } 
} 

compilare questo codice si traduce in due avvertimenti StyleCop:

  • SA1402: FileMayOnlyContainASingleClass
  • SA1403: FileMayOnlyContainASingleNamespace

Soppressione SA1402 funziona come previsto:

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 
    { 
    } 
} 

Sfortunatamente, non riesco a sopprimere SA1403.

Ho provato il seguente soppressione di sopra di ciascuna delle classi (come per la soppressione SA1402):

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

Ho anche provato il seguente soppressione livello assemblaggio, sia nella parte superiore del file e nel mio file di soppressione globale (mi rendo conto che non è un'idea ragionevole):

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

Ma inutilmente.

Quindi, la mia domanda è: come si sopprime l'avvertenza StyleCop SA1403?

Grazie,

E

P.S. Si prega di sopprimere la voglia di ricordarmi che più domini in un unico file dimostra cattiva pratica di programmazione ...

EDIT (20.121.127): In linea con la risposta di Mightymuke Ho guardato la possibilità di utilizzare un SourceFileList.

Utilizziamo il tag StyleCopOverrideSettingsFile nella nostra build, che punta a un file di regole condiviso. In linea con il suggerimento di Mightymuke, ho aggiunto quanto segue al nostro file:

<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> 

Questo non ha funzionato neanche.

Credo, tuttavia, che questo potrebbe essere di progettazione. Ho trovato un StyleCop bug report che suggeriva che il tag SourceFileList non può essere utilizzato a un livello superiore al livello del progetto.

Con queste informazioni in mente, ho tentato di aggiungere un file Settings.StyleCop a livello di progetto.

Ancora nessuna gioia.

Sto esaminando la possibilità che il tag StyleCopOverrideSettingsFile stia annullando ogni altro file di impostazioni. Questo sembra logico ma, se lo è, il comportamento che ho visto implicherebbe che non è possibile utilizzare uno SourceFileList in una build che utilizza anche StyleCopOverrideSettingsFile. In alternativa, potrebbe essere semplicemente che Settings.StyleCop è il nome del file sbagliato o l'ho inserito nella posizione sbagliata (l'ho messo accanto al file csproj.

EDIT (20.130.425):

Alla fine ho rinunciato. Il codice in questione è stato generato automaticamente da un file modello di studio visivo (.TT), quindi sono andato allo sforzo aggiuntivo di rendere il codice del modello suddiviso gli spazi dei nomi in file separati.

+0

L'utilizzo di più spazi dei nomi in un singolo file dimostra ba ...... oh hai già detto che: P. Seriamente, StyleCop è lì per aiutarti a evitare le cattive pratiche, ma vuoi ignorarlo e farlo comunque? Stai andando contro l'uso di esso :). – mattytommo

risposta

3

Si desidera creare un File List nel file delle impostazioni.

Dalla documentazione:

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> 

Nel vostro caso specifico dovrebbe apparire qualcosa di simile:

<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> 
+0

Interessante, non lo sapevo. –

5

È necessario impostare la portata della soppressione. In questo caso, usa "modulo".

[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace", Justification = "This is a generated file which generates all the necessary support classes.")] 

Ho imparato questo dalla pagina seguente, nella sezione "Gobal a livello di Soppressioni": http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

1

ho scoperto modo più semplice per farlo, forse aiuta qualcuno. È possibile fare clic con il tasto destro del mouse sul progetto e scegliere StyleCop Settings.

Si apre il popup e lì è possibile personalizzare gli avvisi e scegliere ciò che si desidera eliminare. Nel tuo caso, warring SA1403 può essere trovato su Regole di manutenibilità \ Contenuti del file

Problemi correlati