Domanda

StyleCop si offre di verificare l'uso coerente degli spazi, ma purtroppo manca l'idea opposta:Forza il codice sorgente a utilizzare le schede.C'è un modo per aggiungere questa funzionalità?Non deve essere necessariamente StyleCop, anche altri strumenti sono benvenuti.

È stato utile?

Soluzione

È possibile utilizzare StyleCop + plugin per far rispettare l'uso di schede.

Dopo aver scaricato posto StyleCopPlus.dll nella cartella Custom Rules all'interno della principale C:\Program Files (x86)\StyleCop 4.7\Custom Rules cartella StyleCop o direttamente nella cartella principale.

Ora, quando si apre un Settings.StyleCop con StyleCopSettingsEditor si sarà in grado di impostare regola SP2001: CheckAllowedIndentationCharacters.

Questa regola può essere trovata nella scheda StyleCop+, sotto la sottoscheda More Custom Rules, sotto il titolo Formatting:

Opzioni regola

Altri suggerimenti

Sono una persona schede-non-spazi, troppo, anche se ci sono un sacco di motivi per utilizzare uno dei due e ci sono altri posti per ottenere in perché si pensa uno è migliore rispetto agli altri . :)

In realtà volevo la stessa cosa - una regola per verificare la presenza di trattini tab - così l'ho scritto in base alla sorgente SpacingRules da StyleCop. Sembra funzionare abbastanza bene, anche se ho usato solo su alcuni progetti finora. Si potrebbe probabilmente essere ottimizzato o qualsiasi altra cosa ... ma funziona.

using System;
using System.Text.RegularExpressions;
using Microsoft.StyleCop;
using Microsoft.StyleCop.CSharp;

namespace CustomRules.StyleCop.CSharp
{
  [SourceAnalyzer(typeof(CsParser))]
  public class SpacingRules : SourceAnalyzer
  {
    public SpacingRules()
    {
    }

    public override void AnalyzeDocument(CodeDocument document)
    {
      Param.RequireNotNull(document, "document");

      CsDocument csdocument = (CsDocument)document;
      if (csdocument.RootElement != null && !csdocument.RootElement.Generated)
      {
        this.CheckSpacing(csdocument.Tokens);
      }
    }

    private void CheckSpacing(MasterList<CsToken> tokens)
    {
      Param.AssertNotNull(tokens, "tokens");

      foreach (var token in tokens)
      {
        if (this.Cancel)
        {
          break;
        }

        if (token.Generated)
        {
          continue;
        }

        switch (token.CsTokenType)
        {
          case CsTokenType.WhiteSpace:
            this.CheckWhitespace(token as Whitespace);
            break;

          case CsTokenType.XmlHeader:
            XmlHeader header = (XmlHeader)token;
            foreach (var xmlChild in header.ChildTokens)
            {
              this.CheckTabsInComment(xmlChild);
            }
            break;

          case CsTokenType.SingleLineComment:
          case CsTokenType.MultiLineComment:
            this.CheckTabsInComment(token);
            break;
        }

        switch (token.CsTokenClass)
        {
          case CsTokenClass.ConstructorConstraint:
            this.CheckSpacing(((ConstructorConstraint)token).ChildTokens);
            break;

          case CsTokenClass.GenericType:
            this.CheckGenericSpacing((GenericType)token);
            this.CheckSpacing(((TypeToken)token).ChildTokens);
            break;

          case CsTokenClass.Type:
            this.CheckSpacing(((TypeToken)token).ChildTokens);
            break;
        }
      }
    }

    private void CheckGenericSpacing(GenericType generic)
    {
      Param.AssertNotNull(generic, "generic");
      if (generic.ChildTokens.Count == 0)
      {
        return;
      }

      foreach (var token in generic.ChildTokens)
      {
        if (this.Cancel)
        {
          break;
        }

        if (token.CsTokenClass == CsTokenClass.GenericType)
        {
          this.CheckGenericSpacing(token as GenericType);
        }

        if (!token.Generated && token.CsTokenType == CsTokenType.WhiteSpace)
        {
          this.CheckWhitespace(token as Whitespace);
        }
      }
    }

    private void CheckWhitespace(Whitespace whitespace)
    {
      Param.AssertNotNull(whitespace, "whitespace");

      if (whitespace.Location.StartPoint.IndexOnLine == 0 && Regex.IsMatch(whitespace.Text, "^ +"))
      {
        this.AddViolation(whitespace.FindParentElement(), whitespace.LineNumber, "TabsMustBeUsed");
      }
    }

    private void CheckTabsInComment(CsToken comment)
    {
      Param.AssertNotNull(comment, "comment");

      var lines = comment.Text.Split('\n');
      for (int i = 0; i < lines.Length; i++)
      {
        if (Regex.IsMatch(lines[i], "^ +"))
        {
          this.AddViolation(comment.FindParentElement(), comment.LineNumber + i, "TabsMustBeUsed");
        }
      }
    }
  }
}

Si noti che è anche avere il file XML incorporato "SpacingRules.xml" in assemblea al fianco di questa cosa. (Leggi la doc StyleCop SDK per più su quello.)

<?xml version="1.0" encoding="utf-8" ?>
<SourceAnalyzer Name="Custom Spacing Rules">
  <Description>
    Rules which verify the spacing placed between keywords and symbols in the code.
  </Description>
  <Rules>
    <Rule Name="TabsMustBeUsed" CheckId="MY1027">
      <Context>Spaces are not allowed. Use tabs instead.</Context>
      <Description>Verifies that the code does not contain spaces.</Description>
    </Rule>
  </Rules>
</SourceAnalyzer>

Una cosa che potresti fare, supponendo che tu stia utilizzando Visual Studio come IDE e che i tuoi compagni di squadra condividano questa idea, sarebbe impostare VS per utilizzare le schede anziché gli spazi, esportare e condividere il file delle impostazioni.

L'impostazione può essere trovata in Strumenti > Opzioni > Editor di testo > Tutte le lingue (o la lingua che desideri utilizzare) > Schede e poi sul lato destro puoi scegliere "Inserisci spazi" o "Mantieni schede".

Per esportare le impostazioni dal tuo studio visivo:Strumenti > Impostazioni di importazione ed esportazione > Esporta le impostazioni dell'ambiente selezionato > seleziona "Opzioni"

Solo un pensiero, ma a dire il vero il vero problema sembra essere l'adesione dei compagni.Altrimenti possono sempre tornare alle impostazioni.In alternativa, al momento del check-in, come suggerito da Sam, puoi eseguire una riformattazione automatizzata.

HTH

L’approccio del pacchetto:

Sembra che la tendenza attuale sia quella di farlo attraverso i pacchetti nuget (e che il classico StyleCop potrebbe essere gradualmente eliminato ad un certo punto).Quindi, per farlo con i pacchetti, procedi come segue:

tramite nuget:

Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers
Install-Package StyleCop.Analyzers -Version 1.1.0-beta006

Da notare il riferimento alla pre-release (al momento), le impostazioni per le schede sono disponibili solo nella beta.

aggiungi il seguente codice al tuo progetto come ca.ruleset:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Custom Rulset" Description="Custom Rulset" ToolsVersion="14.0">
    <Rules AnalyzerId="AsyncUsageAnalyzers" RuleNamespace="AsyncUsageAnalyzers">
        <Rule Id="UseConfigureAwait" Action="Warning" />
    </Rules>
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
        <Rule Id="CA1001" Action="Warning" />
        <Rule Id="CA1009" Action="Warning" />
        <Rule Id="CA1016" Action="Warning" />
        <Rule Id="CA1033" Action="Warning" />
        <Rule Id="CA1049" Action="Warning" />
        <Rule Id="CA1060" Action="Warning" />
        <Rule Id="CA1061" Action="Warning" />
        <Rule Id="CA1063" Action="Warning" />
        <Rule Id="CA1065" Action="Warning" />
        <Rule Id="CA1301" Action="Warning" />
        <Rule Id="CA1400" Action="Warning" />
        <Rule Id="CA1401" Action="Warning" />
        <Rule Id="CA1403" Action="Warning" />
        <Rule Id="CA1404" Action="Warning" />
        <Rule Id="CA1405" Action="Warning" />
        <Rule Id="CA1410" Action="Warning" />
        <Rule Id="CA1415" Action="Warning" />
        <Rule Id="CA1821" Action="Warning" />
        <Rule Id="CA1900" Action="Warning" />
        <Rule Id="CA1901" Action="Warning" />
        <Rule Id="CA2002" Action="Warning" />
        <Rule Id="CA2100" Action="Warning" />
        <Rule Id="CA2101" Action="Warning" />
        <Rule Id="CA2108" Action="Warning" />
        <Rule Id="CA2111" Action="Warning" />
        <Rule Id="CA2112" Action="Warning" />
        <Rule Id="CA2114" Action="Warning" />
        <Rule Id="CA2116" Action="Warning" />
        <Rule Id="CA2117" Action="Warning" />
        <Rule Id="CA2122" Action="Warning" />
        <Rule Id="CA2123" Action="Warning" />
        <Rule Id="CA2124" Action="Warning" />
        <Rule Id="CA2126" Action="Warning" />
        <Rule Id="CA2131" Action="Warning" />
        <Rule Id="CA2132" Action="Warning" />
        <Rule Id="CA2133" Action="Warning" />
        <Rule Id="CA2134" Action="Warning" />
        <Rule Id="CA2137" Action="Warning" />
        <Rule Id="CA2138" Action="Warning" />
        <Rule Id="CA2140" Action="Warning" />
        <Rule Id="CA2141" Action="Warning" />
        <Rule Id="CA2146" Action="Warning" />
        <Rule Id="CA2147" Action="Warning" />
        <Rule Id="CA2149" Action="Warning" />
        <Rule Id="CA2200" Action="Warning" />
        <Rule Id="CA2202" Action="Warning" />
        <Rule Id="CA2207" Action="Warning" />
        <Rule Id="CA2212" Action="Warning" />
        <Rule Id="CA2213" Action="Warning" />
        <Rule Id="CA2214" Action="Warning" />
        <Rule Id="CA2216" Action="Warning" />
        <Rule Id="CA2220" Action="Warning" />
        <Rule Id="CA2229" Action="Warning" />
        <Rule Id="CA2231" Action="Warning" />
        <Rule Id="CA2232" Action="Warning" />
        <Rule Id="CA2235" Action="Warning" />
        <Rule Id="CA2236" Action="Warning" />
        <Rule Id="CA2237" Action="Warning" />
        <Rule Id="CA2238" Action="Warning" />
        <Rule Id="CA2240" Action="Warning" />
        <Rule Id="CA2241" Action="Warning" />
        <Rule Id="CA2242" Action="Warning" />
        <Rule Id="CA1012" Action="Warning" />
    </Rules>
    <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
        <Rule Id="SA1305" Action="Warning" />
        <Rule Id="SA1412" Action="Warning" />
        <Rule Id="SA1600" Action="None" />
        <Rule Id="SA1609" Action="Warning" />
    </Rules>
</RuleSet>

Aggiungilo al file di progetto modificando il file .csproj e aggiungendo:

<PropertyGroup>
    <CodeAnalysisRuleSet>ca.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

Per sovrascrivere le impostazioni della scheda (e altre), dovrai aggiungere un file stylecop.json al tuo progetto.Nelle proprietà del file, impostare l'azione di creazione su "file aggiuntivo (analizzatore)".A seconda del tipo di progetto, la parola effettiva "analizzatore" potrebbe non essere presente.

Modifica il file stylecop.json in qualcosa di simile al seguente:

{
  "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
  "settings": {
    "documentationRules": {
      "companyName": "YourCompanyName",
      "copyrightText": "Copyright (c) {companyName}. All Rights Reserved.\r\nLicensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.",
      "xmlHeader": false,
      "fileNamingConvention": "metadata"
    },
    "indentation": {
      "useTabs": true
    }
  }
}

Almeno per i progetti standard .NET, è necessario assicurarsi che quanto segue sia nel file csproj (e nessun altro riferimento al file):

<ItemGroup>
  <AdditionalFiles Include="stylecop.json" />
</ItemGroup>

Potrebbe essere necessario ricaricare il progetto e i pacchetti per far sì che riconoscano il file stylecop.json.

Riferimenti:

DotNetAnalyzers/StyleCopAnalyzers

.NET Core, analisi del codice e StyleCop

StyleCop supporta la creazione di regole personalizzate, in modo da poter aggiungere il proprio "uso leader schede al posto degli spazi" regola. Se non avete voglia di provare a sviluppare il proprio, è possibile ottenere una regola esistente sia a http: // stylecopcontrib. codeplex.com/ o http://github.com/AArnott/nerdbank.stylecop .rules .

Ok sono riuscito a capire il problema, perché il motivo per cui appare questo avvertimento, apparire perché lo sviluppatore a volte copia e incolla il codice

se si sta utilizzando VS2010 Vai a Esplora soluzioni Il check-in impostazione di stile Cop quindi modificare l'impostazione all'interno lo stile Cop per esempio disattivare o deselezionare l'impostazione [spaziatura .....]

Do it all'interno del vostro server di controllo del codice sorgente. Utilizzare uno script pre-commit per controllare il file per le linee che iniziano con spazi multipli e prevenire il commit.

Sono d'accordo schede sono meglio di spazi. Si tratta di una preferenza personale, ma la coerenza squadra è molto importante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top