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