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