paint-brush
カスタム SwiftLint ルールのパワーを活用し、正規表現に別れを告げましょう@micci
1,998 測定値
1,998 測定値

カスタム SwiftLint ルールのパワーを活用し、正規表現に別れを告げましょう

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

長すぎる; 読むには

SwiftLint は、コーディング標準とベスト プラクティスを強制するための最良のツールです。個々のプロジェクトのニーズに合わせてカスタマイズできる事前定義されたルールが付属しています。 SwiftLint を使用すると、正規表現を使用して複雑なルールを作成できます。ルールは Swift で書かれており効率的で、正規表現と比較してより多くの違反を検出できます。
featured image - カスタム SwiftLint ルールのパワーを活用し、正規表現に別れを告げましょう
Misha K. HackerNoon profile picture

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 をビルドできるようになります。

Xcode を使用したルールの開発

カスタム ルールの開発を容易にするために、プロジェクトに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 プロジェクトに統合しました。この設定を使用すると、必要なだけカスタム ルールを作成してテストできるため、コードの一貫性が維持され、チームのコーディング標準に準拠していることを確認できます。


リンティングを楽しんでください!