SwiftLint là công cụ tốt nhất để thực thi các tiêu chuẩn mã hóa và các phương pháp hay nhất. Nó đi kèm với các quy tắc được xác định trước có thể được tùy chỉnh để phù hợp với nhu cầu của từng dự án. Tuy nhiên, đôi khi các quy tắc tích hợp không đáp ứng được các yêu cầu của dự án. Trong những trường hợp như vậy, chúng tôi viết các biểu thức chính quy để lấp đầy khoảng trống.
Mặc dù regex là một công cụ mạnh mẽ, nhưng việc tạo các quy tắc phức tạp có thể khó khăn hoặc thậm chí là không thể. Đây là lúc các quy tắc SwiftLint gốc xuất hiện. Chúng giống như các quy tắc đi kèm với SwiftLint - chúng được viết bằng Swift, hiệu quả và có thể phát hiện nhiều vi phạm hơn so với regex.
Dự án cuối cùng có thể được tìm thấy tại https://github.com/jpsim/swiftlint-bazel-example
Cài Bazel nếu chưa cài.
brew list --formula | grep -q "bazel" || brew install bazel
Bắt đầu bằng cách tạo một thư mục mới.
mkdir MySwiftLintRules && cd MySwiftLintRules
Tiếp theo, thiết lập một không gian làm việc Bazel mới. Điều này liên quan đến việc tạo một số tệp và bật bzlmod:
touch .bazelrc WORKSPACE MODULE.bazel BUILD && echo "common --enable_bzlmod" > .bazelrc
Thêm mã soạn sẵn vào 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")
Thêm mã soạn sẵn vào tệp BUILD
. Điều này sẽ thêm hỗ trợ Xcode cho dự án Bazel của chúng tôi.
load("@rules_xcodeproj//xcodeproj:defs.bzl", "xcodeproj") xcodeproj( name = "swiftlint_xcodeproj", project_name = "SwiftLint", tags = ["manual"], top_level_targets = [ "@SwiftLint//:swiftlint", "@SwiftLint//Tests:ExtraRulesTests", ], )
Tạo một thư mục để lưu trữ mã nguồn cho các quy tắc của bạn.
mkdir swiftlint_extra_rules && touch swiftlint_extra_rules/Rules.swift && touch swiftlint_extra_rules/BUILD
Và lần cuối cùng, dán mã soạn sẵn vào tệp swiftlint_extra_rules/BUILD
filegroup( name = "extra_rules", srcs = glob(["**/*.swift"]), visibility = ["//visibility:public"], )
Tại thời điểm này, bạn sẽ có thể xây dựng SwiftLint bằng cách sử dụng lệnh bazel build
.
Chúng tôi đã thêm phần phụ thuộc rules_xcodeproj
vào dự án của mình để giúp việc phát triển các quy tắc tùy chỉnh của bạn dễ dàng hơn. Vì vậy, hãy tạo dự án của chúng tôi:
bazel run swiftlint_xcodeproj && open SwiftLint.xcodeproj -a Xcode
Bây giờ, chúng ta có thể xây dựng và gỡ lỗi lược đồ swiftlint
. Bạn có thể sử dụng ứng dụng này như bình thường với nhị phân swiftlint được cài đặt từ homebrew.
Hãy thử chạy nó trên dự án của bạn: Nhấp vào tên lược đồ trên thanh công cụ của cửa sổ dự án của bạn , nhấp vào “Chỉnh sửa lược đồ…“, và đặt "Working Directory" trong tab "Tùy chọn" thành đường dẫn mà bạn muốn thực thi SwiftLint.
Để biết thêm thông tin về cách phát triển các quy tắc SwiftLint gốc, hãy xem CONTRIBUTING.md của SwiftLint
Trong ví dụ này, chúng tôi đang tạo "quy tắc var bị cấm", như được hiển thị trong video hướng dẫn tại https://vimeo.com/819268038 .
Sao chép và dán mã này vào tệp Rules.swift
, sau đó chạy lược đồ swiftlint
trong Xcode.
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) } } } }
Và thế là xong! Bạn đã tạo một quy tắc SwiftLint tùy chỉnh và tích hợp nó vào dự án Swift của mình bằng Bazel. Với thiết lập này, bạn có thể tạo và thử nghiệm bao nhiêu quy tắc tùy chỉnh tùy ý, giúp đảm bảo rằng mã của bạn luôn nhất quán và tuân thủ các tiêu chuẩn viết mã của nhóm bạn.
Chúc mừng lint!