paint-brush
Nutzen Sie die Leistungsfähigkeit benutzerdefinierter SwiftLint-Regeln und verabschieden Sie sich von Regexvon@micci
1,998 Lesungen
1,998 Lesungen

Nutzen Sie die Leistungsfähigkeit benutzerdefinierter SwiftLint-Regeln und verabschieden Sie sich von Regex

von Misha K.3m2023/05/31
Read on Terminal Reader
Read this story w/o Javascript

Zu lang; Lesen

SwiftLint ist das beste Tool zur Durchsetzung von Codierungsstandards und Best Practices. Es enthält vordefinierte Regeln, die an die individuellen Projektanforderungen angepasst werden können. Mit SwiftLint können wir reguläre Ausdrücke verwenden, um komplexe Regeln zu erstellen. Die Regeln sind in Swift geschrieben, effizient und können im Vergleich zu Regex mehr Verstöße erkennen.
featured image - Nutzen Sie die Leistungsfähigkeit benutzerdefinierter SwiftLint-Regeln und verabschieden Sie sich von Regex
Misha K. HackerNoon profile picture

SwiftLint ist das beste Tool zur Durchsetzung von Codierungsstandards und Best Practices. Es verfügt über vordefinierte Regeln, die an individuelle Projektanforderungen angepasst werden können. Manchmal genügen die integrierten Regeln jedoch nicht den Projektanforderungen. In solchen Fällen schreiben wir reguläre Ausdrücke, um die Lücke zu schließen.


Obwohl Regex ein leistungsstarkes Werkzeug ist, kann das Erstellen komplexer Regeln schwierig oder sogar unmöglich sein. Hier kommen native SwiftLint-Regeln ins Spiel. Sie ähneln den Regeln, die mit SwiftLint geliefert werden – sie sind in Swift geschrieben, effizient und können im Vergleich zu Regex mehr Verstöße erkennen.

Das endgültige Projekt finden Sie unter https://github.com/jpsim/swiftlint-bazel-example

Einrichten des Projekts

Installieren Sie Bazel, falls es nicht installiert ist.

 brew list --formula | grep -q "bazel" || brew install bazel


Erstellen Sie zunächst ein neues Verzeichnis.

 mkdir MySwiftLintRules && cd MySwiftLintRules


Als nächstes richten Sie einen neuen Bazel-Arbeitsbereich ein. Dazu müssen mehrere Dateien erstellt und bzlmod aktiviert werden:

 touch .bazelrc WORKSPACE MODULE.bazel BUILD && echo "common --enable_bzlmod" > .bazelrc


Fügen Sie den Boilerplate-Code zur MODULE.bazel hinzu

 module( name = "swiftlint-bazel-example", version = "0.0.0", compatibility_level = 1 ) bazel_dep(name = "swiftlint", version = "0.51.0", repo_name = "SwiftLint") extra_rules = use_extension("@SwiftLint//bazel:extensions.bzl", "extra_rules") extra_rules.setup(srcs = "@swiftlint-bazel-example//swiftlint_extra_rules:extra_rules") bazel_dep(name = "rules_xcodeproj", version = "1.4.0")


Fügen Sie den Boilerplate-Code zur BUILD Datei hinzu. Dadurch wird Xcode-Unterstützung für unser Bazel-Projekt hinzugefügt.

 load("@rules_xcodeproj//xcodeproj:defs.bzl", "xcodeproj") xcodeproj( name = "swiftlint_xcodeproj", project_name = "SwiftLint", tags = ["manual"], top_level_targets = [ "@SwiftLint//:swiftlint", "@SwiftLint//Tests:ExtraRulesTests", ], )


Erstellen Sie ein Verzeichnis zum Speichern des Quellcodes für Ihre Regeln.

 mkdir swiftlint_extra_rules && touch swiftlint_extra_rules/Rules.swift && touch swiftlint_extra_rules/BUILD


Und fügen Sie zum letzten Mal den Boilerplate-Code in die Datei swiftlint_extra_rules/BUILD ein

 filegroup( name = "extra_rules", srcs = glob(["**/*.swift"]), visibility = ["//visibility:public"], )


An diesem Punkt sollten Sie in der Lage sein, SwiftLint mit dem Befehl bazel build zu erstellen.

Regeln mit Xcode entwickeln

Wir haben unserem Projekt die Abhängigkeit rules_xcodeproj hinzugefügt, um die Entwicklung Ihrer benutzerdefinierten Regeln zu vereinfachen. Lassen Sie uns also unser Projekt generieren:

 bazel run swiftlint_xcodeproj && open SwiftLint.xcodeproj -a Xcode


Jetzt können wir das swiftlint Schema erstellen und debuggen. Sie können diese App wie gewohnt mit der vom Homebrew installierten Swiftlint-Binärdatei verwenden.


Versuchen Sie, es in Ihrem Projekt auszuführen: Klicken Sie auf den Schemanamen in der Symbolleiste Ihres Projektfensters , klicken Sie auf „Schema bearbeiten…“ und stellen Sie das „Arbeitsverzeichnis“ auf der Registerkarte „Optionen“ auf den Pfad ein, in dem Sie SwiftLint ausführen möchten.

Weitere Informationen zur Entwicklung nativer SwiftLint-Regeln finden Sie in CONTRIBUTING.md von SwiftLint

Hinzufügen einer benutzerdefinierten Regel

In diesem Beispiel erstellen wir die „Verbotene Var-Regel“, wie im Video-Tutorial unter https://vimeo.com/819268038 gezeigt.


Kopieren Sie diesen Code und fügen Sie ihn in die Datei Rules.swift ein. Führen Sie dann das swiftlint Schema in Xcode aus.

 import SwiftSyntax // This function should return an array containing all of your custom rules func extraRules() -> [Rule.Type] { [ForbiddenVarRule.self] } struct ForbiddenVarRule: ConfigurationProviderRule, SwiftSyntaxRule { var configuration = SeverityConfiguration(.error) init() {} static let description = RuleDescription( identifier: "forbidden_var", name: "Forbidden Var", description: "Variables should not be called 'forbidden'", kind: .idiomatic, nonTriggeringExamples: [ Example("let notForbidden = 0") ], triggeringExamples: [ Example("let ↓forbidden = 0") ] ) func makeVisitor(file: SwiftLintFile) -> ViolationsSyntaxVisitor { Visitor(viewMode: .sourceAccurate) } } private extension ForbiddenVarRule { final class Visitor: ViolationsSyntaxVisitor { override func visitPost(_ node: IdentifierPatternSyntax) { if node.identifier.text == "forbidden" { violations.append(node.identifier.positionAfterSkippingLeadingTrivia) } } } }


Und das ist es! Sie haben eine benutzerdefinierte SwiftLint-Regel erstellt und diese mithilfe von Bazel in Ihr Swift-Projekt integriert. Mit diesem Setup können Sie so viele benutzerdefinierte Regeln erstellen und testen, wie Sie benötigen, und so sicherstellen, dass Ihr Code konsistent bleibt und den Codierungsstandards Ihres Teams entspricht.


Viel Spaß beim Flusen!