paint-brush
Adoptez la puissance des règles SwiftLint personnalisées et dites adieu à Regexpar@micci
1,998 lectures
1,998 lectures

Adoptez la puissance des règles SwiftLint personnalisées et dites adieu à Regex

par Misha K.3m2023/05/31
Read on Terminal Reader

Trop long; Pour lire

SwiftLint est le meilleur outil pour appliquer les normes de codage et les meilleures pratiques. Il est livré avec des règles prédéfinies qui peuvent être personnalisées pour répondre aux besoins de chaque projet. Avec SwiftLint, nous pouvons utiliser des expressions régulières pour créer des règles complexes. Les règles sont écrites en Swift, efficaces et peuvent détecter plus de violations que les regex.
featured image - Adoptez la puissance des règles SwiftLint personnalisées et dites adieu à Regex
Misha K. HackerNoon profile picture

SwiftLint est le meilleur outil pour appliquer les normes de codage et les meilleures pratiques. Il est livré avec des règles prédéfinies qui peuvent être personnalisées pour répondre aux besoins de chaque projet. Cependant, il arrive que les règles intégrées ne répondent pas aux exigences du projet. Dans de tels cas, nous écrivons des expressions régulières pour combler le vide.


Bien que regex soit un outil puissant, la création de règles complexes peut être difficile, voire impossible. C'est là qu'interviennent les règles natives SwiftLint. Elles ressemblent aux règles fournies avec SwiftLint - elles sont écrites en Swift, efficaces et peuvent détecter plus de violations que les regex.

Le projet final peut être trouvé à https://github.com/jpsim/swiftlint-bazel-example

Configuration du projet

Installez Bazel s'il n'est pas installé.

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


Commencez par créer un nouveau répertoire.

 mkdir MySwiftLintRules && cd MySwiftLintRules


Ensuite, configurez un nouvel espace de travail Bazel. Cela implique de créer plusieurs fichiers et d'activer bzlmod :

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


Ajouter le code passe-partout au MODULE.bazel

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


Ajoutez le code passe-partout au fichier BUILD . Cela ajoutera la prise en charge de Xcode pour notre projet Bazel.

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


Créez un répertoire pour stocker le code source de vos règles.

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


Et pour la dernière fois, collez le code passe-partout dans le fichier swiftlint_extra_rules/BUILD

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


À ce stade, vous devriez pouvoir créer SwiftLint à l'aide de la commande bazel build .

Développer des règles avec Xcode

Nous avons ajouté la dépendance rules_xcodeproj à notre projet pour faciliter le développement de vos règles personnalisées. Alors, générons notre projet :

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


Maintenant, nous pouvons construire et déboguer le schéma swiftlint . Vous pouvez utiliser cette application comme d'habitude avec le binaire Swiftlint installé à partir de l'homebrew.


Essayez de l'exécuter sur votre projet : cliquez sur le nom du schéma dans la barre d'outils de la fenêtre de votre projet , cliquez sur "Modifier le schéma…", et définissez le "Répertoire de travail" dans l'onglet "Options" sur le chemin où vous souhaitez exécuter SwiftLint.

Pour plus d'informations sur le développement de règles SwiftLint natives, consultez CONTRIBUTING.md de SwiftLint

Ajout d'une règle personnalisée

Dans cet exemple, nous créons la "règle var interdite", comme indiqué dans le didacticiel vidéo sur https://vimeo.com/819268038 .


Copiez et collez ce code dans le fichier Rules.swift , puis exécutez le schéma swiftlint dans Xcode.

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


Et c'est tout! Vous avez créé une règle SwiftLint personnalisée et l'avez intégrée dans votre projet Swift à l'aide de Bazel. Avec cette configuration, vous pouvez créer et tester autant de règles personnalisées que nécessaire, ce qui vous aide à vous assurer que votre code reste cohérent et conforme aux normes de codage de votre équipe.


Bonne peluche !