SwiftLint は、コーディング標準とベスト プラクティスを強制するための最良のツールです。個々のプロジェクトのニーズに合わせてカスタマイズできる事前定義されたルールが付属しています。ただし、組み込みルールがプロジェクトの要件を満たしていない場合があります。このような場合、ギャップを埋めるために正規表現を作成します。
正規表現は強力なツールですが、複雑なルールの作成は困難または不可能になる場合があります。ここで、ネイティブの SwiftLint ルールが登場します。これらは SwiftLint に付属のルールと同様です。Swift で書かれており、効率的で、正規表現と比較してより多くの違反を検出できます。
最終的なプロジェクトはhttps://github.com/jpsim/swiftlint-bazel-exampleにあります。
Bazel がインストールされていない場合はインストールします。
brew list --formula | grep -q "bazel" || brew install bazel
まず、新しいディレクトリを作成します。
mkdir MySwiftLintRules && cd MySwiftLintRules
次に、新しい Bazel ワークスペースをセットアップします。これには、いくつかのファイルを作成し、bzlmod を有効にすることが含まれます。
touch .bazelrc WORKSPACE MODULE.bazel BUILD && echo "common --enable_bzlmod" > .bazelrc
定型コードを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")
定型コードをBUILD
ファイルに追加します。これにより、Bazel プロジェクトに Xcode サポートが追加されます。
load("@rules_xcodeproj//xcodeproj:defs.bzl", "xcodeproj") xcodeproj( name = "swiftlint_xcodeproj", project_name = "SwiftLint", tags = ["manual"], top_level_targets = [ "@SwiftLint//:swiftlint", "@SwiftLint//Tests:ExtraRulesTests", ], )
ルールのソース コードを保存するディレクトリを作成します。
mkdir swiftlint_extra_rules && touch swiftlint_extra_rules/Rules.swift && touch swiftlint_extra_rules/BUILD
最後に、定型コードをswiftlint_extra_rules/BUILD
ファイルに貼り付けます。
filegroup( name = "extra_rules", srcs = glob(["**/*.swift"]), visibility = ["//visibility:public"], )
この時点で、 bazel build
コマンドを使用して SwiftLint をビルドできるようになります。
カスタム ルールの開発を容易にするために、プロジェクトにrules_xcodeproj
依存関係を追加しました。それでは、プロジェクトを生成しましょう。
bazel run swiftlint_xcodeproj && open SwiftLint.xcodeproj -a Xcode
これで、 swiftlint
スキームを構築してデバッグできるようになりました。このアプリは、Homebrew からインストールされた swiftlint バイナリで通常どおり使用できます。
プロジェクトで実行してみてください。 プロジェクト ウィンドウのツールバーでスキーム名をクリックし、「スキームの編集…」をクリックして、「オプション」タブの「作業ディレクトリ」を SwiftLint を実行するパスに設定します。
ネイティブ SwiftLint ルールの開発の詳細については、SwiftLint のCOTRIBUTING.mdを確認してください。
この例では、 https://vimeo.com/819268038のビデオ チュートリアルで示されているように、「禁止された var ルール」を作成します。
このコードをコピーしてRules.swift
ファイルに貼り付け、Xcode でswiftlint
スキームを実行します。
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) } } } }
以上です!カスタム SwiftLint ルールを作成し、Bazel を使用して Swift プロジェクトに統合しました。この設定を使用すると、必要なだけカスタム ルールを作成してテストできるため、コードの一貫性が維持され、チームのコーディング標準に準拠していることを確認できます。
リンティングを楽しんでください!