SwiftLint 是执行编码标准和最佳实践的最佳工具。它带有预定义的规则,可以自定义这些规则以满足各个项目的需求。但是,有时内置规则达不到项目要求。在这种情况下,我们编写正则表达式来填补空白。 虽然正则表达式是一个强大的工具,但创建复杂的规则可能很困难,甚至是不可能的。这就是原生 SwiftLint 规则的用武之地。它们就像 SwiftLint 附带的规则一样 - 它们是用 Swift 编写的,高效,并且与正则表达式相比可以捕获更多违规行为。 https://twitter.com/simjp/status/1558168307756318720?s=20&embedable=true 最终项目可以在 找到 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") 将样板代码添加到 文件中。这将为我们的 Bazel 项目添加 Xcode 支持。 BUILD 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"], ) 此时,您应该能够使用 命令构建 SwiftLint。 bazel build 使用 Xcode 开发规则 我们已将 依赖项添加到我们的项目中,以便更轻松地开发自定义规则。那么,让我们生成我们的项目: rules_xcodeproj bazel run swiftlint_xcodeproj && open SwiftLint.xcodeproj -a Xcode 现在,我们可以构建和调试 方案。你可以像往常一样使用这个应用程序和从自制软件安装的 swiftlint 二进制文件。 swiftlint 尝试在你的项目上运行它:点击 方案名称,点击“编辑方案...”,然后将“选项”选项卡中的“工作目录”设置为你想要执行 SwiftLint 的路径。 项目窗口工具栏中的 有关开发原生 SwiftLint 规则的更多信息,请查看 SwiftLint 的 CONTRIBUTING.md 添加自定义规则 在此示例中,我们正在创建“禁止的 var 规则”,如 上的视频教程中所示。 https://vimeo.com/819268038 将此代码复制并粘贴到 文件中,然后在 Xcode 中运行 方案。 Rules.swift 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 项目中。通过此设置,您可以根据需要创建和测试任意数量的自定义规则,有助于确保您的代码保持一致并符合团队的编码标准。 快乐棉绒!