SwiftLint es la mejor herramienta para hacer cumplir los estándares de codificación y las mejores prácticas. Viene con reglas predefinidas que se pueden personalizar para adaptarse a las necesidades de cada proyecto. Sin embargo, a veces las reglas integradas no cumplen con los requisitos del proyecto. En tales casos, escribimos expresiones regulares para llenar el vacío.
Si bien la expresión regular es una herramienta poderosa, crear reglas complejas puede ser difícil o incluso imposible. Aquí es donde entran las reglas nativas de SwiftLint. Son como las reglas que vienen con SwiftLint: están escritas en Swift, son eficientes y pueden detectar más infracciones en comparación con las expresiones regulares.
El proyecto final se puede encontrar en https://github.com/jpsim/swiftlint-bazel-example
Instale Bazel si no está instalado.
brew list --formula | grep -q "bazel" || brew install bazel
Comience creando un nuevo directorio.
mkdir MySwiftLintRules && cd MySwiftLintRules
A continuación, configure un nuevo espacio de trabajo de Bazel. Esto implica crear varios archivos y habilitar bzlmod:
touch .bazelrc WORKSPACE MODULE.bazel BUILD && echo "common --enable_bzlmod" > .bazelrc
Agregue el código repetitivo al 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")
Agregue el código repetitivo al archivo BUILD
. Esto agregará compatibilidad con Xcode para nuestro proyecto 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", ], )
Cree un directorio para almacenar el código fuente de sus reglas.
mkdir swiftlint_extra_rules && touch swiftlint_extra_rules/Rules.swift && touch swiftlint_extra_rules/BUILD
Y por última vez, pegue el código repetitivo en el archivo swiftlint_extra_rules/BUILD
filegroup( name = "extra_rules", srcs = glob(["**/*.swift"]), visibility = ["//visibility:public"], )
En este punto, debería poder compilar SwiftLint con el comando bazel build
.
Agregamos la dependencia rules_xcodeproj
a nuestro proyecto para facilitar el desarrollo de sus reglas personalizadas. Entonces, generemos nuestro proyecto:
bazel run swiftlint_xcodeproj && open SwiftLint.xcodeproj -a Xcode
Ahora, podemos construir y depurar el esquema swiftlint
. Puede usar esta aplicación como de costumbre con el binario swiftlint instalado desde homebrew.
Intente ejecutarlo en su proyecto: haga clic en el nombre del esquema en la barra de herramientas de la ventana de su proyecto , haga clic en "Editar esquema..." y configure el "Directorio de trabajo" en la pestaña "Opciones" en la ruta donde le gustaría ejecutar SwiftLint.
Para obtener más información sobre el desarrollo de reglas nativas de SwiftLint, consulte CONTRIBUTING.md de SwiftLint.
En este ejemplo, estamos creando la "regla de var prohibida", como se muestra en el tutorial de video en https://vimeo.com/819268038 .
Copie y pegue este código en el archivo Rules.swift
, luego ejecute el esquema swiftlint
en 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) } } } }
¡Y eso es! Creó una regla SwiftLint personalizada y la integró en su proyecto Swift usando Bazel. Con esta configuración, puede crear y probar tantas reglas personalizadas como necesite, lo que ayuda a garantizar que su código se mantenga coherente y se ajuste a los estándares de codificación de su equipo.
¡Feliz pelusa!