paint-brush
拥抱自定义 SwiftLint 规则的力量并告别正则表达式经过@micci
2,004 讀數
2,004 讀數

拥抱自定义 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 编写的,高效,并且与正则表达式相比可以捕获更多违规行为。

设置项目

如果未安装,请安装 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方案。你可以像往常一样使用这个应用程序和从自制软件安装的 swiftlint 二进制文件。


尝试在你的项目上运行它:点击项目窗口工具栏中的方案名称,点击“编辑方案...”,然后将“选项”选项卡中的“工作目录”设置为你想要执行 SwiftLint 的路径。

有关开发原生 SwiftLint 规则的更多信息,请查看 SwiftLint 的CONTRIBUTING.md

添加自定义规则

在此示例中,我们正在创建“禁止的 var 规则”,如https://vimeo.com/819268038上的视频教程中所示。


将此代码复制并粘贴到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 项目中。通过此设置,您可以根据需要创建和测试任意数量的自定义规则,有助于确保您的代码保持一致并符合团队的编码标准。


快乐棉绒!