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