Використання SwiftLint та небезпеки для кращих практик Swift

Ця публікація спочатку з'явилася у Swift Post, доступна тут.

Apple, Swift стає все більш популярною серед спільноти розробників. Більшість із нас уже почали адаптувати свої проекти до цього фольклору. Ми не можемо бути настільки обережними, як ми повинні бути, оскільки Swift - це дуже гнучка мова, і зловживати нею дуже просто. Особливо важливою є культура Objective-C, застосовуючи передовий досвід.

Прочитавши Swifty Tips від Göksel, я зрозумів, що пару його порад можна автоматично перевірити за допомогою SwiftLint. Крім того, ми ліниві люди, і ми зазвичай забуваємо перевірити наш код, перш ніж об’єднатися в master. Щойно тут, Danger виходить на сцену з блискучим одягом і вказує, що ми робимо щось небезпечне.

Звучить цікаво .. Але що це за інструменти?

SwiftLint

SwiftLint - це інструмент із відкритим кодом для застосування стилю та умов Swift. Він розроблений Realm. Ви можете встановити правила стилю кодування та примусити їх під час розробки. SwiftLint має інструмент командного рядка, плагін Xcode, інтеграцію AppCode та Atom. Отже, це завжди відповідає вашому середовищу розвитку. Він покаже вам попередження та / або помилки, якщо ви порушите правила зв’язування.

Ви можете ознайомитися з посібником із налаштування та підручником звідси. Після встановлення у вас з’являться деякі правила за замовчуванням. Наприклад, він попереджає, коли ви використовуєте приватний IBOutlet або змушуєте його розгортати додаткові елементи.

Давайте подивимося поради Гокселя. Він каже: "Ніколи не використовуйте неявно розгортання факультативів". SwiftLint надає це за замовчуванням саме так, як він описує. SwiftLint попередить вас, коли ви неявно відкрутите необов'язковий, за винятком випадків, коли це IBOutlet Інший - "Уникнення неправильного використання". SwiftLint досить розумний, щоб вказати, коли ви не використовуєте прив’язані додаткові додатки.

якщо нехай _ = Foo.optionalValue {} // Тригери попередження
if case .some (нехай _) = self {} // Запускає попередження
if foo () {let _ = bar ()} // Не запускає попередження
if foo () {_ = bar ()} // Не запускає попередження

На додаток до застосування найкращих практик окремо, ми хочемо зробити кодову базу послідовною. Спростіть застосування спеціальних правил. Однак ці правила повинні відповідати кращій практиці. Налаштування обкладинки обробляється з файлу .swiftlint.yml. Цей файл знаходиться в основному шляху проекту. Ми можемо вмикати, вимикати або записувати власні правила у цей файл YML. Давайте розглянемо кілька прикладів.

Перш за все, написання великої функції - це взагалі поганий знак. Якщо ваша функція зростає, це означає, що ви повинні розділити відповідальність. Додайте наступний фрагмент коду до файлу .swiftlint.yml. Це попереджає розробників щодо функцій менше 200 рядків. Якщо програміст досягає 300, SwiftLint створює помилку. Пам'ятайте, ви можете ігнорувати попередження, але не помилки.

function_body_length:
 - 200 # попередження
 - 300 # помилка

Майже в кожному проекті є залежності або фрагменти коду, які неможливо змінити. Ці фрагменти коду взагалі не повинні бути пов'язані. Наприклад, якщо проект використовує CocoaPods як менеджер залежностей, у ньому буде папка Pods, яка зберігає всі файли залежностей. Нам потрібно виключити цю папку з процесу зв’язування. Як ви бачите нижче, це так просто.

виключено:
  - стручки

Або керівництво компанії, або розробник, що працює в проекті, мають стиль кодування. SwiftLint допомагає новачкам перейнятися цими стилями під час процесу бортової роботи.

Як ви бачили з прикладів, SwiftLint надає додатковий імпульс - це гнучкість. Іноді доводиться порушувати правила в спеціальних рядках або файлах. Ці ситуації вирішували у SwiftLint із спеціальними коментарями. Ви можете скористатися поданими нижче для коригування правил у цих випадках.

Додайте цей коментар, щоб вимкнути правило у файлі:

// swiftlint: відключити ім'я правила

Додайте цей коментар, щоб вимкнути правило в наступному рядку:

// swiftlint: відключити: наступне ім'я правила

Додайте цей коментар, щоб вимкнути правило в попередньому рядку:

// swiftlint: відключити: попереднє ім'я правила

Ви можете отримати список всіх правил, виконавши команду swiftlint правила в терміналі.

Нарешті ми доопрацювали свої правила, і тепер ми можемо мирно кодувати. Але навіть у деяких випадках ви повинні бути обережнішими, ніж просто застосовувати свої правила підв’язки. Ось тут наступає небезпека.

P.S .: Мій попередньо визначений файл .swiftlint.yml ви можете знайти тут .

Небезпека ️

Кожен проект / фрагмент коду має свій специфічний потік. Коли проект росте, підтримувати та додавати нові функції стає складніше. Похибки до помилок збільшуються. Загальнодоступних інструкцій щодо кодування та застосування найкращих практик. Ми люди, ми робимо помилки. Небезпека може наздогнати основні помилки та задуматися про складніші проблеми. Наприклад, він може зафіксувати звичайні помилки друку або згенеровані зміни файлів, які не слід змінювати самостійно. Це також може змусити вас писати тести, якщо ви пишете більше 20 рядків коду. Правила у ваших руках так само, як і SwiftLint.

Небезпека - це дорогоцінний камінь Ruby, який працює в CI під час процесу запиту на запит / об'єднання. Це залишає повідомлення, коментарі або навіть не дає змоги створити CI, коли ваші правила порушені. Небезпека може працювати на декількох інструментах CI та спілкуватися в GitHub, Bitbucket та GitLab.

Небезпека може залишати повідомлення, попередження, помилки в PR / MR. Джерело: небезпеки.системи

Ви можете дотримуватися посібника з налаштування тут, щоб встановити небезпеку у вашому процесі CI. Небезпека застосовує правила зі сценарію Ruby, написаного в Dangerfile. Подивимось, що ми можемо зробити там.

Для єдиної відповідальності та спрощення перегляду коду розробники не повинні відкривати великі запити на витяг. Якщо запит на тягу містить більше 600 рядків коду, повинно бути попередження про розділення запиту на витяг. Небезпека може забезпечити це одним рядком конфігурації:

попередити "Великий PR, розглянути поділ на менший", якщо git.lines_of_code> 600

Що ще? Якщо ви працюєте з процесом розробки Test-After, ви можете легко забути писати тести. З іншого боку, повинен бути автоматизований спосіб для коментарів "Ви забули додати тести". Загалом, якщо ви змінили більше 20 рядків коду, слід написати тести. Кількість рядків залежить від вашого рішення, але ви отримали ідею. Давайте подивимось, як ми можемо досягти цього за допомогою небезпеки:

## Перевіримо, чи є якісь зміни в папці проекту
has_app_changes =! git.modified_files.grep (/ ProjectName /). порожній?
## Тоді ми повинні перевірити, чи тести оновлюються
has_test_changes =! git.modified_files.grep (/ ProjectNameTests /). порожній?
## Нарешті, давайте поєднаємо їх та поставимо додаткову умову
## для зміненої кількості рядків коду
якщо has_app_changes &&! has_test_changes && git.lines_of_code> 20
  fail ("Тести не оновлювались", sticky: false)
кінець

Небезпека підходить для будь-яких проектів. Він надає плагіни широкий спектр конфігурацій на декількох мовах. У випадку Swift Ash Furrow розробив плагін для SwiftLint. Завдяки цьому плагіну ми можемо мати попередження SwiftLint як вбудовані коментарі у запиті на виклик. Посібник з установки можна переглянути тут. Після встановлення вам потрібно буде додати один із наступних рядків до кінця свого Dangerfile.

swiftlint.lint_files
swiftlint.lint_files inline_mode: вірно

Dangerfile забезпечує ваші інструкції щодо розробки, застосовані до вашого коду. Це робить вас більш впевненими. Зрештою, попередження навчають вас бути обережнішими. Тут є довідковий посібник, який дає вам більш детальний огляд можливостей Danger.

Примітка. Вам не потрібно налаштовувати CI. Можна запустити небезпеку на вашому локальному апараті з небезпекою локальної команди.

Завдяки відповіді Ерена, якщо локальна команда про небезпеку не наштовхується на останній відкритий PR, завжди можна використовувати таку команду:

https: // YOUR_PR_URL --dangerfile = YOUR_DANGERFILE_PATH

P.S .: Мій попередньо визначений Dangerfile можна знайти тут here.

Бонус: SwiftLint з Git Hook

Якщо ви працюєте з різними текстовими редакторами або IDE, які SwiftLint не підтримує, ви можете використовувати лише інструменти командного рядка, щоб підкреслити свій код. Це додатковий крок, і його легко забути. Добре, що ми можемо це автоматизувати. Функція гачка в Git - це ще одне місце для автоматизації речей. В основному, гачки Git - це сценарії, де Git виконує до або після подій, таких як вчинення, натискання та отримання. Ми можемо запустити SwiftLint в одному з цих сценаріїв. Особисто я використовую SwiftLint у гачку перед фіксацією, коли я пишу Swift у піднесеному тексті.

P.S .: Мій повний гачок, який попередньо здійснив, ви можете знайти тут . Якщо ви хочете використовувати те саме, просто помістіть файл вище в папку .git / hooks всередині вашого проекту. (Там ви побачите зразкові сценарії гаків. Помістіть їх серед них.) Ви також можете використовувати як інший гачок. Ви можете переглянути список доступних гачків та додаткову інформацію тут.

Кінець

Нехай Danger та SwiftLint поводяться за дрібниці для вас. Відтепер ви можете пропускати основні проблеми та зосереджуватися на більш складних речах під час перегляду коду. SwiftLint та небезпека гарантують, що все на своєму місці, як ви хочете. Хочете спробувати?

Дякуємо за прочитане️! Допоможіть поширити слово .

У вас є питання, пропозиції, коментарі чи ідеї для майбутніх публікацій блогу? Зв'яжіться зі мною у Twitter або напишіть коментар! Ви також можете піти за мною на GitHub.

Мої інші повідомлення:

  • Використання хмарних повідомлень Firebase для віддалених повідомлень в iOS
  • Перший досвід роботи сервера в Swift - методи HTTP та операції з базою даних
  • Створення інтерфейсу API Swift Backend - перевірка модулів у додатку Swift на стороні сервера