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