Sử dụng SwiftLint và Nguy hiểm cho Thực tiễn Tốt nhất của Swift

Bài đăng này ban đầu xuất hiện trong Swift Post, có sẵn ở đây.

Táo khuyết Swift ngày càng trở nên phổ biến trong cộng đồng nhà phát triển. Hầu hết chúng ta đã bắt đầu thích nghi các dự án của mình với dân gian này. Trong khi áp dụng, chúng tôi có thể không cẩn thận như chúng ta nên Swift là một ngôn ngữ rất linh hoạt và nó rất dễ sử dụng sai. Đặc biệt đến từ văn hóa Objective-C, áp dụng các thực tiễn tốt nhất trở nên thực sự quan trọng.

Sau khi đọc Mẹo Swifty từ Göksel, tôi nhận ra một vài mẹo của anh ấy có thể được kiểm tra tự động với SwiftLint. Ngoài ra, chúng tôi là những người lười biếng và chúng tôi có xu hướng quên kiểm tra mã của mình trước khi hợp nhất thành chủ. Ngay tại đây, Danger bước lên sân khấu với bộ quần áo sáng bóng và chỉ ra chúng tôi đang làm điều gì đó nguy hiểm.

Nghe có vẻ thú vị.. Nhưng thực chất những công cụ này là gì?

SwiftLint

SwiftLint là một công cụ nguồn mở để thực thi các quy ước và phong cách Swift. Nó được phát triển bởi Realm. Bạn có thể đặt quy tắc kiểu mã hóa của mình và buộc chúng trong quá trình phát triển. SwiftLint có một công cụ dòng lệnh, plugin Xcode, tích hợp AppCode và Atom. Vì vậy, nó luôn phù hợp với môi trường phát triển của bạn. Nó sẽ hiển thị cho bạn các cảnh báo và / hoặc lỗi nếu bạn vi phạm các quy tắc linting.

Bạn có thể xem hướng dẫn thiết lập và hướng dẫn từ đây. Sau khi cài đặt, bạn sẽ có một số quy tắc theo mặc định. Ví dụ, nó cảnh báo khi bạn sử dụng IBOutlet riêng hoặc buộc hủy kết nối trong các tùy chọn.

Hãy để chúng tôi xem xét lời khuyên của Gotksel. Anh ấy nói, không bao giờ sử dụng tùy chọn ngầm SwiftLint cung cấp điều này theo mặc định chính xác cách anh mô tả. SwiftLint sẽ cảnh báo bạn khi bạn ngầm mở khóa tùy chọn ngoại trừ nếu nó IB IBOutlet. Một cái khác là tránh Tránh sử dụng sai. SwiftLint đủ thông minh để chỉ ra khi bạn không sử dụng các tùy chọn bị ràng buộc.

if let _ = Foo.optionalValue {} // Trigers cảnh báo
if case .some (let _) = self {} // Kích hoạt cảnh báo
if foo () {let _ = bar ()} // Không kích hoạt cảnh báo
if foo () {_ = bar ()} // Không kích hoạt cảnh báo

Ngoài việc áp dụng các thực tiễn tốt nhất riêng lẻ, chúng tôi muốn làm cho codebase nhất quán. Làm cho nó dễ dàng hơn để áp dụng các quy tắc tùy chỉnh. Những quy tắc này phải phù hợp với thực tiễn tốt nhất, mặc dù. Cấu hình linting được xử lý từ tệp .swiftlint.yml. Tập tin này nằm trong đường dẫn chính của dự án. Chúng tôi có thể kích hoạt, vô hiệu hóa hoặc viết các quy tắc tùy chỉnh trong tệp YML này. Hãy cùng xem một số ví dụ.

Điều đầu tiên trước tiên, viết một chức năng lớn nói chung là một dấu hiệu xấu. Nếu chức năng của bạn ngày càng lớn hơn, điều đó có nghĩa là bạn nên phân chia trách nhiệm. Thêm đoạn mã sau vào tệp .swiftlint.yml của bạn. Điều này cảnh báo các nhà phát triển có chức năng dưới 200 dòng. Nếu lập trình viên đạt 300, SwiftLint sẽ tạo ra lỗi. Hãy nhớ rằng, bạn có thể bỏ qua các cảnh báo nhưng không có lỗi.

function_body_length:
 - Cảnh báo 200 #
 - Lỗi 300 #

Hầu như mọi dự án đều có phần phụ thuộc hoặc đoạn mã không thể thay đổi. Những mảnh mã này không nên bị xơ xác chút nào. Ví dụ: nếu một dự án sử dụng CocoaPods làm trình quản lý phụ thuộc, thì nó sẽ có thư mục Pods lưu giữ tất cả các tệp phụ thuộc. Chúng ta cần loại trừ thư mục này khỏi quá trình linting. Như bạn có thể thấy bên dưới, nó rất dễ dàng.

loại trừ:
  - Pods

Hướng dẫn của công ty hoặc nhà phát triển làm việc trong dự án có phong cách mã hóa. SwiftLint giúp người mới tiếp nhận những phong cách này trong quá trình lên tàu.

Như bạn đã thấy từ các ví dụ, điều làm tăng thêm sức mạnh cho SwiftLint là tính linh hoạt. Đôi khi bạn phải phá vỡ các quy tắc trong các dòng hoặc tập tin đặc biệt. Những tình huống được xử lý trong SwiftLint với các bình luận đặc biệt. Bạn có thể sử dụng các điều sau đây để điều chỉnh các quy tắc trong những trường hợp này.

Thêm nhận xét này để vô hiệu hóa quy tắc trong tệp:

// swiftlint: vô hiệu hóa rule_name

Thêm nhận xét này để vô hiệu hóa quy tắc trong dòng sau:

// swiftlint: vô hiệu hóa: quy tắc tiếp theo

Thêm nhận xét này để vô hiệu hóa quy tắc trong dòng trước:

// swiftlint: vô hiệu hóa: rule_name trước đó

Bạn có thể lấy danh sách tất cả các quy tắc bằng cách chạy lệnh quy tắc swiftlint trong terminal.

Cuối cùng, chúng tôi đã hoàn thiện các quy tắc của mình và bây giờ chúng tôi có thể viết mã trong hòa bình. Nhưng ngay cả một số trường hợp, bạn phải cẩn thận hơn là chỉ áp dụng các quy tắc linting của bạn. Đây là nơi nguy hiểm xảy ra.

P.S.: Bạn có thể tìm thấy tệp .swiftlint.yml được xác định trước của tôi ở đây.

Nguy hiểm

Mỗi dự án / đoạn mã có lưu lượng cụ thể của riêng nó. Khi dự án phát triển, việc duy trì và thêm các tính năng mới trở nên khó khăn hơn. Lỗi dễ tăng. Có hướng dẫn mã hóa và áp dụng các thực tiễn tốt nhất thường không đủ. Chúng ta là con người, chúng ta phạm sai lầm. Nguy hiểm có thể bắt lỗi cơ bản và chúng ta hãy nghĩ những vấn đề khó hơn. Ví dụ, nó có thể bắt lỗi chính tả hoặc các thay đổi tệp được tạo mà bạn không nên tự thay đổi. Nó cũng có thể buộc bạn phải viết bài kiểm tra nếu bạn viết hơn 20 dòng mã. Các quy tắc nằm trong tay của bạn giống như SwiftLint.

Nguy hiểm là một viên ngọc Ruby chạy trong CI trong quá trình yêu cầu kéo / hợp nhất yêu cầu. Nó để lại tin nhắn, bình luận hoặc thậm chí không xây dựng CI của bạn khi quy tắc của bạn bị vi phạm. Nguy hiểm có thể chạy trên một số công cụ CI và có thể trò chuyện trên GitHub, Bitbucket và GitLab.

Nguy hiểm có thể để lại tin nhắn, cảnh báo, lỗi trên PR / MR. Nguồn: nguy hiểm. Hệ thống

Bạn có thể làm theo hướng dẫn thiết lập tại đây để cài đặt Nguy hiểm cho quy trình CI của mình. Nguy hiểm áp dụng các quy tắc từ một tập lệnh Ruby được viết trong Dangerfile. Hãy để có một cái nhìn về những gì chúng ta có thể làm trong đó.

Đối với trách nhiệm duy nhất và xem xét mã dễ dàng hơn, các nhà phát triển không nên mở các yêu cầu kéo lớn. Nếu một yêu cầu kéo có hơn 600 dòng mã, cần có một cảnh báo để phân tách yêu cầu kéo. Nguy hiểm có thể cung cấp điều này với một dòng cấu hình duy nhất:

cảnh báo "PR lớn, xem xét chia thành nhỏ hơn" nếu git.lines_of_code> 600

Còn gì nữa không Nếu bạn làm việc với quy trình phát triển Test-After, bạn có thể dễ dàng quên viết bài kiểm tra. Mặt khác, nên có cách tự động cho nhóm Bạn đã quên thêm các bài kiểm tra Nhận xét. Nói chung, nếu bạn thay đổi hơn 20 dòng mã, bạn nên viết bài kiểm tra. Số lượng dòng tùy thuộc vào quyết định của bạn, nhưng bạn đã có ý tưởng. Chúng ta hãy xem cách chúng ta có thể đạt được điều này với Nguy hiểm:

## Hãy kiểm tra xem có bất kỳ thay đổi nào trong thư mục dự án không
has_app_changes =! git.modified_files.grep (/ ProjectName /). trống?
## Sau đó, chúng ta nên kiểm tra nếu các bài kiểm tra được cập nhật
has_test_changes =! git.modified_files.grep (/ ProjectNameTests /). trống?
## Cuối cùng, hãy kết hợp chúng và đặt điều kiện bổ sung
## cho số dòng mã đã thay đổi
if has_app_changes &&! has_test_changes && git.lines_of_code> 20
  thất bại ("Các thử nghiệm không được cập nhật", dính: sai)
kết thúc

Nguy hiểm là phù hợp cho mọi loại dự án. Nó cung cấp một loạt các cấu hình cho một số ngôn ngữ bằng các plugin. Trong trường hợp Swift, Ash Furrow đã phát triển một plugin cho SwiftLint. Nhờ plugin này, chúng tôi có thể có các cảnh báo SwiftLint dưới dạng nhận xét nội tuyến trong yêu cầu kéo. Bạn có thể xem hướng dẫn cài đặt ở đây. Sau khi cài đặt, bạn sẽ cần thêm một trong các dòng sau để kết thúc Dangerfile của mình.

swiftlint.lint_files
swiftlint.lint_files inline_mode: đúng

Dangerfile đảm bảo các nguyên tắc phát triển của bạn được áp dụng cho mã của bạn. Nó làm cho bạn tự tin hơn. Về lâu dài, các cảnh báo dạy bạn phải cẩn thận hơn. Có một hướng dẫn tham khảo ở đây để cung cấp cho bạn cái nhìn chi tiết hơn về các khả năng của Nguy hiểm.

Lưu ý: Bạn không có cấu hình CI. Nó có thể chạy nguy hiểm trên máy cục bộ của bạn với lệnh cục bộ nguy hiểm.

Nhờ phản hồi của Eren, nếu lệnh cục bộ nguy hiểm không chạy qua PR mở cuối cùng, bạn luôn có thể sử dụng lệnh sau:

nguy hiểm pr https: // YOU_PR_URL --dangerfile = YOU_DANGERFILE_PATH

P.S.: Bạn có thể tìm thấy Dangerfile được xác định trước của tôi ở đây.

Phần thưởng: SwiftLint với Git Hook

Nếu bạn làm việc với các trình soạn thảo văn bản hoặc IDE khác nhau mà SwiftLint không hỗ trợ, bạn chỉ có thể sử dụng các công cụ dòng lệnh để xử lý mã của mình. Đây là một bước bổ sung và nó rất dễ quên. Điều tốt, chúng ta có thể tự động hóa điều này. Tính năng hook trong Git là một nơi khác để tự động hóa mọi thứ. Về cơ bản, Git hook là các tập lệnh trong đó Git thực thi trước hoặc sau các sự kiện như cam kết, đẩy và nhận. Chúng tôi có thể chạy SwiftLint trong một trong các tập lệnh này. Cá nhân tôi, tôi sử dụng SwiftLint trong hook pre-commit trong khi tôi viết Swift trong văn bản tuyệt vời.

P.S.: Bạn có thể tìm thấy hook pre-commit đầy đủ của tôi ở đây. Nếu bạn muốn sử dụng tương tự, chỉ cần đặt tệp ở trên dưới thư mục .git / hook bên trong dự án của bạn. (Bạn sẽ thấy các tập lệnh hook mẫu trong đó. Đặt nó trong số chúng.) Bạn cũng có thể sử dụng như một hook khác. Bạn có thể xem danh sách các móc có sẵn và biết thêm thông tin ở đây.

Sự kết thúc

Hãy để Danger và SwiftLint xử lý những thứ tầm thường cho bạn. Từ bây giờ, bạn có thể bỏ qua các vấn đề cơ bản và tập trung vào những thứ phức tạp hơn trong quá trình xem xét mã. SwiftLint và Nguy hiểm đảm bảo rằng mọi thứ được đặt đúng chỗ bạn muốn. Muốn thử?

Cảm ơn đã đọc️! Giúp truyền bá từ .

Bạn có câu hỏi, đề xuất, ý kiến ​​hoặc ý tưởng cho bài viết blog sắp tới? Liên lạc với tôi trên Twitter hoặc viết bình luận! Bạn cũng có thể theo tôi trên GitHub.

Bài viết khác của tôi:

  • Sử dụng Firebase Cloud Messaging cho Thông báo từ xa trong iOS
  • Trải nghiệm phía máy chủ đầu tiên trong Swift - Phương thức HTTP & hoạt động cơ sở dữ liệu
  • Làm cho API phần cuối của Swift có thể kiểm tra - Kiểm tra đơn vị trong ứng dụng phía máy chủ Swift