paint-brush
Adopte el poder de las reglas personalizadas de SwiftLint y diga adiós a Regexpor@micci
1,998 lecturas
1,998 lecturas

Adopte el poder de las reglas personalizadas de SwiftLint y diga adiós a Regex

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

Demasiado Largo; Para Leer

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. Con SwiftLint, podemos usar expresiones regulares para crear reglas complejas. Las reglas están escritas en Swift, son eficientes y pueden detectar más violaciones en comparación con las expresiones regulares.
featured image - Adopte el poder de las reglas personalizadas de SwiftLint y diga adiós a Regex
Misha K. HackerNoon profile picture

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

Configuración del proyecto

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 .

Desarrollo de reglas con Xcode

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.

Agregar una regla personalizada

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!