Vraag Is er een manier om het gebruik van tabbladen af ​​te dwingen in plaats van spaties?


StyleCop biedt aan om te controleren op consistent gebruik van spaties, maar mist het tegenovergestelde idee: Forceer broncode om tabbladen te gebruiken. Is er een manier om deze functionaliteit toe te voegen? Het hoeft geen StyleCop te zijn, andere tools zijn ook welkom.


17
2018-02-17 13:34


oorsprong


antwoorden:


Je kunt gebruiken StyleCop + plug-in om het gebruik van tabbladen af ​​te dwingen.

Na het downloaden StyleCopPlus.dll plaats het in Custom Rules map in de hoofdmap StyleCop C:\Program Files (x86)\StyleCop 4.7\Custom Rules of rechtstreeks in de hoofdmap.

Nu, bij het openen van een Settings.StyleCop met StyleCopSettingsEditor je zult een regel kunnen instellen SP2001: CheckAllowedIndentationCharacters.

Deze regel is te vinden onder de StyleCop+ tabblad, onder de More Custom Rules subtab, onder de Formatting rubriek:

Rule Options


8
2018-05-16 10:57



Ik ben ook een tabs-niet-spaties persoon, maar er zijn voldoende redenen om er een te gebruiken en er zijn andere plaatsen om in te stappen waarom je denkt dat de een beter is dan de andere. :)

Ik wilde eigenlijk hetzelfde: een regel om te controleren op tabinspringingen - dus schreef ik het op basis van de SpacingRules-bron van StyleCop. Het lijkt redelijk goed te werken, hoewel ik het tot nu toe alleen in een paar projecten heb gebruikt. Het kan waarschijnlijk worden geoptimaliseerd of wat dan ook ... maar het werkt.

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");
        }
      }
    }
  }
}

Merk op dat je naast dit ding ook het ingesloten XML-bestand "SpacingRules.xml" in de assembly moet hebben. (Lees het StyleCop SDK-document voor meer informatie hierover.)

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

11
2018-04-07 23:23



Een ding dat je zou kunnen doen, ervan uitgaande dat je Visual Studio als je IDE gebruikt, en dat je teamgenoten dit idee inhuren, is om VS in te stellen om tabbladen te gebruiken in plaats van spaties, het instellingenbestand te exporteren en te delen.

De instelling vindt u onder Extra> Opties> Teksteditor> Alle talen (of de taal die u wilt gebruiken)> Tabbladen en aan de rechterkant kunt u kiezen voor 'Spaties invoegen' of 'Tabbladen behouden'.

Om de instellingen vanuit uw visuele studio te exporteren: Extra> Instellingen importeren en exporteren> Geselecteerde omgevinginstellingen exporteren> selecteer 'Opties'

Gewoon een gedachte - maar om eerlijk te zijn lijkt het echte probleem de buy-in van je teamgenoten te zijn. Ze kunnen altijd teruggaan naar hun instellingen. Als alternatief kunt u bij het inchecken, zoals Sam suggereerde, een aantal geautomatiseerde re-formattering uitvoeren.

HTH


3
2018-02-17 19:52



StyleCop ondersteunt het maken van aangepaste regels, dus u kunt uw eigen regel 'leidende tabs gebruiken in plaats van spaties' toevoegen. Als je geen zin hebt om je eigen te ontwikkelen, kun je een bestaande regel bij een van beide krijgen http://stylecopcontrib.codeplex.com/ of http://github.com/AArnott/nerdbank.stylecop.rules.


2
2018-02-17 19:59



Oké, ik ben erin geslaagd het probleem te achterhalen omdat de reden waarom deze waarschuwing verschijnt, het lijkt omdat de ontwikkelaar de code soms kopieert en plakt

als u VS2010 gebruikt Ga naar oplossingsverkenner Check in Setting Style Cop wijzig vervolgens de instelling binnen de stijl Cop, bijvoorbeeld de instelling uitschakelen of uitschakelen [Spacing .....]


2
2018-06-01 11:29



Doe het binnen uw broncontroleserver. Gebruik een pre-commit-script om het bestand te controleren op regels die beginnen met meerdere spaties en om de commit te voorkomen.

Ik ben het ermee eens dat tabbladen beter zijn dan spaties. Het is een persoonlijke voorkeur, maar teamconsistentie is erg belangrijk.


1
2018-02-17 18:54



De aanpak van het pakket:

Het lijkt erop dat de huidige trend is om dit te doen via nuget-pakketten (en dat de klassieke StyleCop op een gegeven moment kan worden uitgefaseerd). Dus, om dit met de pakketten te doen, doe je het volgende:

via nuget:

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

Let op de verwijzing naar de pre-releaset (op dit moment), de instellingen voor tabbladen zijn alleen beschikbaar in de bèta.

voeg de volgende code toe aan je project als 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>

Voeg het toe aan uw projectbestand door het .csproj-bestand te bewerken en toe te voegen:

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

Als u de instellingen voor het tabblad (en andere) wilt overschrijven, moet u een stylecop.json-bestand aan uw project toevoegen. Stel in de bestandseigenschappen de Build-actie in op '(analyseer) extra bestand'. Afhankelijk van het projecttype is het woord 'analyzer' mogelijk niet aanwezig.

Bewerk het bestand stylecop.json in zoiets als het volgende:

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

Ten minste voor .NET standaardprojecten, moet u ervoor zorgen dat het volgende in het csproj-bestand staat (en geen andere verwijzingen naar het bestand):

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

Mogelijk moet u het project en de pakketten opnieuw laden om ervoor te zorgen dat ze het stylecop.json-bestand herkennen.

Referenties:

DotNetAnalyzers / StyleCopAnalyzers

.NET Core, Code Analysis en StyleCop


1
2018-03-05 14:40