paint-brush
Abrace o poder das regras personalizadas do SwiftLint e diga adeus ao Regexpor@micci
2,004 leituras
2,004 leituras

Abrace o poder das regras personalizadas do SwiftLint e diga adeus ao Regex

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

Muito longo; Para ler

SwiftLint é a melhor ferramenta para impor padrões de codificação e melhores práticas. Ele vem com regras predefinidas que podem ser personalizadas para atender às necessidades individuais do projeto. Com o SwiftLint, podemos usar expressões regulares para criar regras complexas. As regras são escritas em Swift, eficientes e podem detectar mais violações em comparação com o regex.
featured image - Abrace o poder das regras personalizadas do SwiftLint e diga adeus ao Regex
Misha K. HackerNoon profile picture

SwiftLint é a melhor ferramenta para impor padrões de codificação e melhores práticas. Ele vem com regras predefinidas que podem ser personalizadas para atender às necessidades individuais do projeto. No entanto, às vezes as regras integradas ficam aquém dos requisitos do projeto. Nesses casos, escrevemos expressões regulares para preencher a lacuna.


Embora o regex seja uma ferramenta poderosa, criar regras complexas pode ser difícil ou até mesmo impossível. É aqui que entram as regras nativas do SwiftLint. Elas são exatamente como as regras que vêm com o SwiftLint - são escritas em Swift, são eficientes e podem capturar mais violações em comparação com o regex.

O projeto final pode ser encontrado em https://github.com/jpsim/swiftlint-bazel-example

Configurando o Projeto

Instale o Bazel se não estiver instalado.

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


Comece criando um novo diretório.

 mkdir MySwiftLintRules && cd MySwiftLintRules


Em seguida, configure um novo espaço de trabalho Bazel. Isso envolve a criação de vários arquivos e a ativação do bzlmod:

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


Adicione o código clichê ao 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")


Adicione o código clichê ao arquivo BUILD . Isso adicionará suporte ao Xcode para nosso projeto 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", ], )


Crie um diretório para armazenar o código-fonte de suas regras.

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


E pela última vez, cole o código clichê no arquivo swiftlint_extra_rules/BUILD

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


Neste ponto, você deve ser capaz de construir o SwiftLint usando o comando bazel build .

Desenvolvendo regras com o Xcode

Adicionamos a dependência rules_xcodeproj ao nosso projeto para facilitar o desenvolvimento de suas regras personalizadas. Então, vamos gerar nosso projeto:

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


Agora, podemos construir e depurar o esquema swiftlint . Você pode usar este aplicativo como de costume com o binário swiftlint instalado a partir do homebrew.


Tente executá-lo em seu projeto: Clique no nome do esquema na barra de ferramentas da janela do projeto , clique em “Editar esquema…“ e defina o "Diretório de trabalho" na guia "Opções" para o caminho onde você gostaria de executar o SwiftLint.

Para obter mais informações sobre como desenvolver regras nativas do SwiftLint, confira CONTRIBUTING.md do SwiftLint

Adicionando uma regra personalizada

Neste exemplo, estamos criando a "regra var proibida", conforme mostrado no tutorial em vídeo em https://vimeo.com/819268038 .


Copie e cole esse código no arquivo Rules.swift e execute o esquema swiftlint no 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) } } } }


E é isso! Você criou uma regra personalizada do SwiftLint e a integrou ao seu projeto Swift usando o Bazel. Com essa configuração, você pode criar e testar quantas regras personalizadas precisar, ajudando a garantir que seu código permaneça consistente e em conformidade com os padrões de codificação de sua equipe.


Feliz linting!