Подфайл, чем открыть

Обновлено: 02.07.2024

CocoaPods — это круто. Я имел честь пообщаться с Фабио Пелосином, основным участником, на встрече NSLondon некоторое время назад и увидеть, сколько страсти эти ребята вложили в этот проект.

Я был одним из первых сторонников в 2012 году, и у меня есть несколько модулей в репозитории Specs (с префиксом ADB). Недавно я провел несколько дней, изучая некоторые скрытые аспекты CocoaPods, и в итоге прочитал исходный код Core и Xcodeproj.

Во время одного из недавних NSLondon(-ов) 2013 года Орта объяснил преимущества CocoaPods, а Абизер Насир на одном из следующих мероприятий обсудил использование подмодулей Git. В основном сравнивая их видения.

То, что я собираюсь объяснить здесь, является решением распространенного сценария:

Управляйте версиями внутренних частных модулей в проектах без проблем.

Хорошо, начнем. У вас есть проект под нашей DVCS (надеюсь, это Git для вашего здравомыслия).

Вы используете некоторые сторонние компоненты, такие как AFNetworking и MagicalRecords, и у вас есть подмодули для этого, хипстер!

Вы решаете использовать CocoaPods, устанавливаете его, следуя инструкциям, и добавляете Podfile.

Вы удаляете подмодули и запускаете pod install : рабочее пространство создано для вас, и все готово. Пока все хорошо.

Тогда вы понимаете, что было бы неплохо иметь собственный репозиторий модулей и создавать частные модули для некоторых частей вашего проекта. Вам нравятся модульные вещи, и, возможно, однажды ваши модули будут готовы к отправке запроса на включение в репозиторий Specs, чтобы внести свой вклад в сообщество открытого исходного кода.

Пришло время создать спецификацию для вашего частного модуля, пометить его и отправить. Что-то вроде этого:

под установить и ситуация выглядит следующим образом:

Вы хотите поместить папку Pods в файл .gitignore.

Круто! Но. есть но. Вы активно работаете над MyInternalLibrary, вы трогаете эти файлы по несколько раз в день. Файлы, к которым вы прикасаетесь, будут перезаписаны при следующем запуске pod install. Вот дерьмо. Вы не хотите открывать ~/MyInternalLibrary , трогать вещи, устанавливать модуль ~/MyProject снова и снова. Это неосуществимо.

Решение заключается в использовании модулей разработки. Когда вы устанавливаете модуль разработки, его файлы символически связываются в Pods.xcodeproj .

Теперь Podfile указывает, что модуль необходимо получить из локального каталога (с использованием директивы :path). Модуль разработки не требует наличия версии с репозиторием Git, но он должен содержать спецификацию модуля, описывающую, как получить файлы модуля. Это ваш новый подфайл:

Отлично, теперь вы можете безопасно прикасаться к вещам и фиксировать изменения в MyInternalLibrary (в ~/MyInternalLibrary ) во время работы над MyProject.xcworkspace .

А вот и самое интересное.

У вас есть CI и система развертывания, для которой требуется определенная версия вашего внутреннего модуля. У вас возникает соблазн пометить изменения в MyInternalLibrary при развертывании и использовании определенного подфайла в выпускной ветке MyProject .

Ага. Да. ты крутой.

Вы видите здесь проблему? Обновлять версии/теги внутренних стручков — это заноза в заднице. Никогда нельзя тратить время разработчика таким образом.

Я вижу, вы думаете.

"Блин, стручки здесь не совсем то. Я хипстер, и сабмодуль был бы идеален! Но фуфф. субмодули или CocoaPods? Уфф фф."

Ответ. используйте оба! Является ли управление версиями/тегированием вашей библиотеки (только для размещения CocoaPods) сложным? Что ж, пусть подмодули обработают это за вас (используя sha1 коммита, знаете ли. Git указывает на правильную ревизию).

Идеальное решение — поместить вашу внутреннюю библиотеку в папку проекта и обращаться с ней как с подмодулем git:

Ваш подфайл будет

При запуске pod install файлы в ~/MyProject/MyInternalLibrary будут символически связаны внутри Pods.xcodeproj .

  • работайте над своим проектом и меняйте библиотеки/модули во время разработки
  • вносить изменения в свои библиотеки/модули независимо от проекта
  • отмечайте/версируйте свои внутренние библиотеки/модули, когда хотите (а не тогда, когда это требуется вашим проектом)
  • избегайте необходимости в отдельном подфайле для ветки выпуска в MyProject

Люди слишком часто хотят полностью использовать CocoaPods, другие предпочитают только подмодули (и они ошибаются, и точка). Я думаю, что прагматичное решение таких крайних случаев, как этот, состоит в том, чтобы использовать оба!

Работайте так, как если бы это был просто подмодуль, но с высвобожденной мощью CocoaPods!

Альберто де Бортоли

Альберто Де Бортоли

Главный инженер-программист @ Just Eat. Езжайте быстро, но тщательно думайте.

Аспектно-ориентированный подход к iOS Analytics

[Обновление от 06.09.2014] В мае 2014 года Питер Стейнбергер выпустил книгу «Аспекты, вдохновленные…»

Если вы работаете с другими разработчиками над проектом с использованием Cocoapods, возможно, вы заметили приведенное ниже изменение в вашем Podfile.lock при попытке установить модули. Может быть неприятно видеть эту разницу, когда вы не внесли никаких изменений.

cocoapod image 1

Проблема

Происходит следующее: ваш компьютер загружает общедоступные модули не так, как компьютер вашего коллеги. Это может произойти по двум возможным причинам. Либо ваш источник CDN (сеть доставки контента) называется не так, как имя вашего товарища по команде, либо вы все вместе используете другой источник.

Пример: несоответствие имени источника

Сотрудник команды А совершает новую работу, установив модули из источника CDN с именем «trunk» на своем компьютере. Товарищ по команде B извлекает новую работу, и они синхронизируют свои локальные модули. На машине товарища по команде B также есть источник CDN, но на их машине он называется «cocoapods-». Разница возникает из-за того, что имена источников не совпадают, даже если модули и расположение источника совпадают.

cocoapod image 2

Если при запуске установки модуля вы видите разницу в одну строку, возможно, что:

Решение

В терминале запустите:

Если вы видите в своем списке репозиториев «master» (сопоставленный с устаревшим источником) или «cocoapods-» (сопоставленный с CDN), вы можете удалить их, используя:

В следующий раз, когда вы запустите установку модуля, вы не увидите никаких различий в Podfile.lock.

Примечание. Каждый член команды должен проверить свою среду и обновить ее соответствующим образом. В противном случае вы все равно можете увидеть различия в источниках/именах. Дважды проверяйте любые изменения в Podfile.lock во время проверки кода, чтобы выявить их до объединения.

Пример

По своему опыту я знаю, что это может быть неприятно. Надеюсь, это помогло вам и вашей команде!

Используйте это руководство по CocoaPods для Swift, чтобы узнать, как устанавливать и управлять зависимостями сторонних библиотек в ваших проектах Swift.

Версия


Примечание об обновлении. Рони Розен обновил это руководство для Xcode 11 и Swift 5. Джошуа Грин написал оригинал.

CocoaPods – популярный менеджер зависимостей для проектов Swift и Objective-C Cocoa. По данным веб-сайта CocoaPods, его используют тысячи библиотек и миллионы приложений. Но что такое менеджер зависимостей и зачем он вам нужен?

Диспетчер зависимостей упрощает добавление, удаление, обновление и управление сторонними зависимостями, которые использует ваше приложение.

Например, вместо того, чтобы заново изобретать собственную сетевую библиотеку, вы можете легко подключить Alamofire с помощью диспетчера зависимостей. Вы можете указать либо точную версию для использования, либо диапазон допустимых версий.

Это означает, что даже если Alamofire получит обновление с изменениями, не имеющими обратной совместимости, ваше приложение сможет продолжать использовать старую версию, пока вы не будете готовы ее обновить.

В этом руководстве вы узнаете, как использовать CocoaPods со Swift. В частности, вы:

  • Установите CocoaPods.
  • Поработайте с функциональным демонстрационным приложением, которое заставит вас задуматься о мороженом.
  • Используйте CocoaPods для добавления сети.
  • Подробнее о семантическом управлении версиями.
  • Добавьте другую библиотеку, используя гибкую версию.

Примечание. Этот учебник по CocoaPods требует базового знакомства с iOS и разработкой Swift. Если вы новичок в iOS и/или Swift, ознакомьтесь с некоторыми другими письменными и/или видео-руководствами на этом сайте, прежде чем приступать к этому руководству. Или погрузитесь в нашу книгу iOS Apprentice.

Это руководство также включает классы, использующие базовую графику. Хотя знание Core Graphics полезно, оно не обязательно. Если вы хотите узнать больше, прочтите серию статей «Современная базовая графика на Swift».

Начало работы

Загрузите начальный проект, нажав кнопку Загрузить материалы в верхней или нижней части руководства.

На протяжении всего этого руководства вы будете работать с приложением под названием Ice Cream Shop, Inc.. Вы будете использовать CocoaPods для простого добавления зависимостей к приложению вместо того, чтобы писать свои собственные.< /p>

Прежде чем вы сможете продолжить работу с этим учебным пособием, вам необходимо установить CocoaPods. К счастью, CocoaPods использует Ruby, который поставляется со всеми версиями macOS X, начиная с версии 10.7.

Откройте Терминал и введите следующую команду:

Введите пароль по запросу.Выходные данные терминала будут отображать различные выходные данные, связанные с получением, установкой и документацией, заканчивая «XX установленных драгоценных камней».

Примечание. Вы должны использовать sudo для установки CocoaPods, но после его установки вам не нужно будет использовать его снова в этом руководстве.

Наконец, введите эту команду в Терминале, чтобы завершить настройку:

Этот процесс занимает несколько минут, так как репозиторий CocoaPods Master Specs клонируется в ~/.cocoapods/ на вашем компьютере.

Подробный вариант регистрирует ход выполнения процесса, позволяя вам наблюдать за процессом, а не видеть кажущийся «замороженным» экран.

Отлично, теперь вы можете использовать CocoaPods!

Магазин мороженого, Inc.

Ваш главный клиент – Ice Cream Shop, Inc. Их мороженое настолько популярно, что они не успевают выполнять заказы клиентов на прилавке. Они наняли вас для создания стильного приложения для iOS, которое позволит покупателям заказывать мороженое прямо со своих iPhone.

Вы начали разработку приложения, и оно идет хорошо. Посмотрите на свой прогресс, открыв IceCreamShop.xcodeproj, затем соберите и запустите. Вы увидите аппетитный рожок ванильного мороженого:

Ice Cream Shop, Inc.

Пользователь должен иметь возможность выбрать вкус мороженого на этом экране, но пока это невозможно. Ваш первый шаг — завершить реализацию этой функции.

Откройте Main.storyboard в группе Views/Storyboards & Nibs, чтобы увидеть макет приложения. Вот краткий обзор сердцевины приложения — сцены Выберите вкус:

Компоненты сцены

  • PickFlavorViewController — это контроллер представления для этой сцены. Он обрабатывает взаимодействие с пользователем и предоставляет данные для представления коллекции, в котором отображаются различные вкусы мороженого.
  • IceCreamView – это настраиваемое представление, в котором отображается рожок мороженого в зависимости от режима поддержки Flavor .
  • ScoopCell — это настраиваемая ячейка представления коллекции, содержащая ScoopView , которая получает цвета из модели Flavor.

Несмотря на то, что все магазины Ice Cream Shop, Inc. имеют общие фирменные вкусы, в каждом из них есть и свои местные вкусы. По этой причине веб-служба должна предоставлять данные для Flavor s.

Однако это не объясняет, почему пользователи не могут выбирать вкус мороженого.

Откройте PickFlavorViewController.swift в группе Controllers, и вы увидите заглушенный метод:

Ага, ароматизаторов нет! Вам нужно реализовать функцию!

Хотя вы могли использовать URLSession и писать свои собственные сетевые классы, есть более простой способ: используйте Alamofire!

У вас может возникнуть соблазн загрузить эту библиотеку и перетащить исходные файлы прямо в ваш проект. Однако это будет трудный путь. CocoaPods предлагает гораздо более элегантное и гибкое решение.

Установка вашей первой зависимости

Ваш первый шаг – закрыть Xcode. Да, вы правильно прочитали.

Пришло время создать Podfile, в котором вы определите зависимости вашего проекта.

Откройте Терминал и перейдите к каталогу, содержащему ваш проект IceCreamShop, с помощью команды cd:

Далее введите следующую команду:

Это создает подфайл для вашего проекта.

Наконец, введите следующую команду, чтобы открыть подфайл с помощью Xcode для редактирования:

Примечание. Не используйте TextEdit для редактирования подфайла, так как он заменяет стандартные кавычки более графически привлекательными набранными кавычками. Это может привести к тому, что CocoaPods запутаются и выдадут ошибки. Вместо этого используйте Xcode или другой текстовый редактор для программирования для редактирования вашего подфайла.

Подфайл по умолчанию выглядит следующим образом:

Теперь ваш подфайл должен выглядеть так:

Это сообщает CocoaPods, что ваш проект нацелен на iOS 9.0 и будет использовать фреймворки вместо статических библиотек. Хотя Swift и CocoaPods поддерживают статическое связывание, не все библиотеки, которые вы включаете, поддерживают это. Один из них, который вы будете использовать в этом проекте, не работает.

Если вы программировали только на Swift, это может выглядеть немного странно. Это потому, что подфайл на самом деле написан на Ruby. Вам не нужно знать Ruby, чтобы использовать CocoaPods, но вы должны знать, что даже незначительные текстовые ошибки приведут к тому, что CocoaPods выдаст ошибку.

Несколько слов о библиотеках

Вы увидите, что термин библиотека часто используется как общий термин, который на самом деле означает библиотеку или платформу. Этот учебник также виновен в случайном смешении этих слов.

Возможно, вас интересуют различия между библиотекой, фреймворком и CocoaPod.Ничего страшного, если терминология покажется вам немного запутанной!

CocoaPod или для краткости pod — это общий термин для библиотеки или платформы, которые добавляются в ваш проект с помощью CocoaPods.

В iOS 8 появились динамические платформы, которые позволяют объединять код, изображения и другие ресурсы вместе. До iOS 8 вы создавали CocoaPods как «толстые» статические библиотеки. «Fat» означает, что они содержат несколько наборов инструкций кода, например i386 для симулятора, armv7 для устройств и т. д. Однако Swift не позволяет статическим библиотекам содержать такие ресурсы, как изображения или активы.

Вернуться к установке первой зависимости

Наконец-то пришло время добавить вашу первую зависимость с помощью CocoaPods. Добавьте следующее в свой подфайл сразу после use_frameworks! :

Это сообщает CocoaPods, что вы хотите включить Alamofire версии 4.9.1 в качестве зависимости для вашего проекта.

Сохраните и закройте подфайл.

Теперь вам нужно указать CocoaPods установить зависимости для вашего проекта.

Введите следующую команду в Терминал, убедившись, что вы все еще находитесь в каталоге, содержащем проект IceCreamShop и Podfile:

Вы должны увидеть такой вывод:

Откройте папку проекта с помощью Finder, и вы увидите, что CocoaPods создали новый файл IceCreamShop.xcworkspace и папку Pods для хранения всех зависимости проекта.

Примечание. Отныне, как упоминалось в предупреждении командной строки, вы всегда должны открывать проект с файлом .xcworkspace, а не .xcodeproj< /эм>. В противном случае вы столкнетесь с ошибками сборки.

Отлично! Вы только что добавили свою первую зависимость с помощью CocoaPods!

Использование установленных модулей

Теперь вы будете использовать свою новую зависимость Alamofire.

Если проект Xcode открыт, закройте его и откройте IceCreamShop.xcworkspace.

Откройте PickFlavorViewController.swift и добавьте следующее чуть ниже существующего импорта:

Создайте и запустите. Вы пока не увидите никаких изменений, но будьте уверены, что Alamofire теперь доступен.

Первая компиляция после интеграции зависимости Alamofire

Затем замените loadFlavors() следующим:

Вот пошаговая демонстрация того, что происходит в этом коде:

  1. Вы используете Alamofire, чтобы создать запрос GET и загрузить plist, содержащий вкусы мороженого.
  2. Чтобы прервать цикл сильных ссылок, вы используете слабую ссылку на себя в блоке завершения ответа. Как только блок выполнится, вы сразу же получите сильную ссылку на себя, чтобы вы могли установить для него свойства позже.
  3. Затем вы проверяете, что response.result показывает успех, а response.result.value представляет собой массив словарей.
  4. Теперь вы задаете для self.flavors массив объектов Flavor, которые создает FlavorFactory. Это класс, написанный для вас «коллегой» (пожалуйста!), который берет массив словарей и использует их для создания экземпляров Flavor .
  5. Наконец, вы перезагружаете представление коллекции и выбираете первый вариант.

Создайте и запустите. Теперь вы можете выбрать вкус мороженого!

Выберите вкус

Теперь вкусный топпинг

Приложение выглядит хорошо, но его можно улучшить.

Вы заметили, что приложению требуется секунда, чтобы загрузить файл ароматов? Если у вас быстрое подключение к Интернету, вы можете не заметить задержки, но вашим клиентам не всегда так повезет.

Ваш следующий шаг — показать индикатор загрузки в приложении, чтобы помочь клиентам понять, что оно загружает данные, а не просто возится с библиотеками. MBProgressHUD — действительно хороший индикатор, который хорошо здесь работает. И он поддерживает CocoaPods; какое совпадение! :]

Чтобы использовать этот модуль, вам необходимо добавить его в свой файл Podfile. Вместо того, чтобы открывать Podfile из командной строки, теперь вы можете найти его в цели Pods в рабочей области:

Pods in Workspace

Откройте Podfile и добавьте следующее сразу после строки Alamofire:

Сохраните файл и установите зависимости с помощью pod install в Терминале, как и раньше.

Заметили что-то другое на этот раз? Да, вы указали номер версии как ~> 1.0. Но почему?

CocoaPods рекомендует использовать семантическое управление версиями во всех модулях. Найдите минутку, чтобы понять, что это такое.

Семантическое управление версиями

Много раз вы увидите версию, написанную так: 1.0.0.Эти три числа являются основными, дополнительными и исправлениями номерами версий.

Например, для номера версии 1.0.0 1 — это основной номер, первый 0 — дополнительный номер, а второй 0 — номер исправления.

Пример семантического управления версиями

Если основной номер увеличивается, это означает, что версия содержит изменения, не совместимые с предыдущими версиями. При обновлении модуля до следующей основной версии может потребоваться исправить ошибки сборки, иначе модуль может вести себя не так, как раньше.

Если второстепенный номер увеличивается, это означает, что версия содержит новую функциональность, совместимую с предыдущими версиями. Когда вы решите обновиться, вам может понадобиться или не понадобиться новая функциональность, но она не должна вызывать ошибок сборки или изменять существующее поведение.

Если номер исправления увеличивается, это означает, что новая версия содержит исправления ошибок, но не содержит новых функций или изменений в поведении. Как правило, вы всегда хотите как можно скорее обновить версии исправлений, чтобы иметь последнюю стабильную версию модуля.

Наконец, когда вы увеличиваете старший номер — основной, затем второстепенный, затем исправление — в соответствии с приведенными выше правилами, вы должны сбросить любые младшие числа равны нулю.

Вот пример:

Рассмотрим модуль с текущим номером версии 1.2.3.

Если вы вносите изменения, которые не совместимы с предыдущими версиями, не имеют новых функций, но исправляют существующие ошибки, вам присваивается версия 2.0.0.

Время испытания

Если в модуле установлена ​​текущая версия 2.4.6, и вы вносите изменения, устраняющие ошибки и добавляющие обратно совместимые функции, каким должен быть новый номер версии?

[spoiler]
Ответ: 2.5.0
Объяснение: если вы вносите изменения, включающие новые функции, совместимые с предыдущими версиями, вы увеличиваете второстепенный и сбросьте исправление на ноль.
[/spoiler]

Если в модуле установлена ​​текущая версия 3.5.8, и вы вносите изменения в существующие функции, которые не являются обратно совместимыми, каким должен быть номер новой версии?

[spoiler]
Ответ: 4.0.0
Объяснение: если изменения изменяют существующее поведение и не являются обратно совместимыми, необходимо увеличить основной и сбросьте номера второстепенных и исправлений на ноль.
[/spoiler]

Если в модуле установлена ​​текущая версия 10.20.30 и вы исправляете только ошибки, каким должен быть номер новой версии?

[spoiler]
Ответ: 10.20.31
Объяснение: Если вы исправляете только ошибки, вы только увеличиваете номер патча.
[/spoiler]

Сказав все это, есть одно исключение из этих правил:

Если номер версии модуля меньше 1.0.0, он считается бета-версией. Незначительное увеличение числа может включать изменения, несовместимые с предыдущими версиями.

Итак, вернемся к MBProgressHUB: использование ~> 1.0 означает, что вы должны установить последнюю версию, которая больше или равна 1.0, но меньше 2.0 .

Это гарантирует, что вы получите последние исправления ошибок и функции при установке этого модуля, но вы не будете случайно вносить обратно несовместимые изменения.

Вы также можете использовать несколько других операторов. Полный список см. в Справочнике по синтаксису подфайлов.

Теперь, когда вы узнали, как операторы работают с CocoaPods, пришло время закончить ваше приложение.

Отображение прогресса

Если вы помните, вы создавали индикатор выполнения, чтобы показывать пользователям, когда в приложении загружаются варианты.

Чтобы завершить эту функцию, вернитесь к PickFlavorViewController.swift и добавьте следующее сразу после других импортов:

Затем добавьте следующие вспомогательные методы после loadFlavors() :

Теперь в loadFlavors() добавьте следующие две строки (как указано):

Как следует из названий методов, showLoadingHUD() показывает экземпляр MBProgressHUD во время загрузки запроса GET. hideLoadingHUD() скрывает HUD после завершения запроса. Так как showLoadingHUD() находится вне замыкания, ему не нужен собственный префикс.

Создайте и запустите. Теперь вы увидите индикатор загрузки во время загрузки вкусов. Если ваше интернет-соединение слишком быстрое для этого, вы можете добавить оператор sleep(_:) непосредственно перед hideLoadingHUD(), чтобы вы могли ощутить достоинства MBProgressHUD. :]

Приложение с символом загрузки

Отличная работа! Теперь клиенты могут выбирать свой любимый вкус мороженого, и они видят индикатор загрузки во время загрузки вкусов.

Куда идти дальше?

Вы можете загрузить готовый проект, нажав кнопку Загрузить материалы вверху или внизу этой страницы.

Поздравляем! Теперь вы знаете основы использования CocoaPods, включая создание и изменение зависимостей и понимание семантического управления версиями. Теперь вы готовы начать использовать их в своих проектах!

С CocoaPods можно делать гораздо больше. Вы можете искать существующие модули на официальном сайте CocoaPods. Кроме того, обратитесь к руководствам CocoaPods, чтобы узнать подробнее об этом превосходном инструменте. Но будьте осторожны, как только вы начнете его использовать, вы удивитесь, как раньше обходились без него! :]

Надеюсь, вам понравилось читать это руководство по CocoaPods так же, как и мне при его написании. Какие ваши любимые CocoaPods? На какие из них вы больше всего полагаетесь в повседневных проектах? Не стесняйтесь поделиться или задать любые вопросы в комментариях ниже!


  • Каждый день до WWDC я пишу одно новое бесплатное руководство. Нажмите здесь, чтобы увидеть полный список!

CocoaPods — это самая большая в мире коллекция готовых модулей с открытым исходным кодом для разработчиков iOS. На момент написания статьи их было около 46 000.

Это вторая часть серии руководств по обновлению ваших приложений для использования современной инфраструктуры — инструментов, которые помогут вам создавать более качественное программное обеспечение за счет автоматизации задач. В этом выпуске мы рассмотрим еще одну проблему, с которой сталкивается наше тестовое приложение: хотя оно использует SwiftyBeaver для ведения журнала, оно делает это, буквально копируя файлы непосредственно в проект. Хотя это, безусловно, работает, это означает, что любые будущие обновления SwiftyBeaver не будут автоматически объединяться с нашим приложением.

CocoaPods призван решить эту проблему. Вместо того, чтобы копировать чужой код в свой проект, вы ссылаетесь на их репозиторий Git и номер версии и позволяете CocoaPods установить его для вас. Более того, вы можете обновить все свои сторонние модули до последней версии с помощью одной команды, что принесет с собой любые новые функции и обновления безопасности.

Итак, мы собираемся установить CocoaPods, а затем обновить наше приложение, чтобы оно загружало SwiftyBeaver с помощью CocoaPods, а не импортировало файлы напрямую.

Прежде чем мы продолжим, загрузите тестовое приложение, которое мы используем для этой серии руководств. Если вы выполнили первую часть этой серии руководств — рефакторинг приложения для добавления модульных тестов — вам следует использовать код, который вы получили в конце.

Предупреждение. Пример проекта был написан специально для этой серии руководств и содержит ошибки и проблемы, которые мы рассмотрим в этой серии руководств. Если вы ищете пример кода для обучения, это не то место.

СПОНСОРЫ Обучение у всех разное. Для новичков это обучение выдержке. Для тех, кто учится в одиночку, это концепции обучения. Для юниоров это навыки прохождения собеседования. Бесплатный еженедельный информационный бюллетень Фернандо охватывает все этапы обучения.

Добавление CocoaPods в наш проект

Если у вас еще нет инструментов CocoaPods, первое, что вам нужно сделать, это установить их. CocoaPods на самом деле написан на Ruby, но на вашем Mac уже есть инструменты, необходимые для его установки и запуска.

Итак, откройте приложение "Терминал" и выполните следующую команду:

Это займет всего несколько секунд, пока ваш Mac загрузит и установит CocoaPods и его зависимости.

Следующий шаг — перейти в каталог, в котором находится ваш проект. Именование Xcode здесь немного бесполезно, потому что есть каталог «Paraphrase», который сам содержит подкаталог «Paraphrase», однако вы ищете каталог parent — тот, где вы можете увидеть Paraphrase.xcodeproj.

Каталог моего проекта находится на моем рабочем столе, поэтому я выполнил эту команду

Если вы сохранили его в другом месте, измените эту команду по мере необходимости.

Теперь важная часть: нам нужно попросить CocoaPods настроить наш проект для использования pod. Пожалуйста, запустите эту команду:

Это попросит CocoaPods создать файл с именем Podfile в каталоге нашего проекта, чтобы он мог хранить конфигурацию CocoaPods нашего проекта. Это будет выглядеть примерно так:

Это просит CocoaPods добавить SwiftyBeaver в наш проект. В нем не указана какая-либо версия SwiftyBeaver, поэтому CocoaPods будет автоматически использовать последнюю версию — позже мы рассмотрим альтернативы.

Прежде чем двигаться дальше, нам нужно внести еще одно изменение. В верхней части вашего подфайла вы увидите этот комментарий:

Мы собираемся указать цель развертывания iOS 11.0, которая подходит для большинства приложений. Итак, замените эту строку на эту:

Сохраните свой подфайл, затем запустите эту команду из терминала:

Если вы использовали CocoaPods раньше, выполнение этой команды займет несколько секунд, пока CocoaPods получает SwiftyBeaver и подготавливает наш проект.

Если вы никогда не использовали CocoaPods раньше, вы, возможно, столкнетесь с одной из самых больших проблем CocoaPods: он использует централизованный репозиторий «основных спецификаций», содержащий метаданные для всех версий всех CocoaPods в своей системе, и этот репозиторий должен быть загружен на ваш компьютер, чтобы продолжить. Да, метаданные для всех 40 000. Да, с их историями версий тоже.

В результате главный репозиторий CocoaPods будет занимать около 600 МБ на вашем компьютере на момент написания этой статьи. Он будет загружен при первом запуске модуля установки в любом проекте, а затем будет обновляться с течением времени. Боюсь, это невозможно обойти, и если у вас более медленное или ограниченное подключение к Интернету, я думаю, вы поймете, почему это было такой проблемой для пользователей в прошлом.

В любом случае, даже если у вас относительно быстрое подключение к Интернету, этот процесс займет некоторое время — репозиторий должен быть не только загружен, но и информация в нем должна быть полностью обработана Git. Итак, идите и заварите кофе или чай, потому что это займет некоторое время, независимо от того, какие у вас настройки…

Обновление нашего кода

С возвращением! Запуск pod init в первый раз всегда поначалу немного шокирует систему, но как только он завершится, все готово — с этого момента все идет гладко.

Это важно. Видите ли, CocoaPods не изменил ваш исходный файл Paraphrase.xcodeproj — это тот же проект Xcode, которым он всегда был. Вместо этого он сгенерировал рабочее пространство Xcode, которое обертывает ваш проект, добавляя запрошенные вами модули. Это будет называться Paraphrase.xcworkspace.

Теперь это важно по двум причинам:

  1. Если вы хотите, чтобы ваши платформы, управляемые CocoaPods, были доступны при создании кода, вам нужно использовать рабочую область, иначе они не будут распознаны.
  2. Если вы попытаетесь открыть свое рабочее пространство, в то время как ваш проект также открыт, Xcode будет недоволен. Файлы проекта Xcode непостоянны, поэтому открывать их одновременно в двух местах рискованно. В результате Xcode будет категорически отказывать вам в открытии проекта напрямую, если рабочая область также открыта, и наоборот.

Итак: если у вас был открыт проект Xcode, закройте его.

После этого откройте Paraphrase.xcworkspace. Вы должны увидеть как проект «Paraphrase», так и проект «Pods», а внутри Paraphrase находится тот же код, который у нас был раньше — вы можете эффективно продолжить работу, как и раньше, предоставив CocoaPods делать свое дело.

В этом случае нам нужно обновить наш проект, чтобы он использовал версию SwiftyBeaver, предоставленную CocoaPods, а не ту, которая была добавлена ​​вручную. Для этого нужно выполнить два шага: удалить весь код SwiftyBeaver, а затем импортировать модуль SwiftyBeaver везде, где он нужен.

Итак, выберите группу SwiftyBeaver внутри проекта Paraphrase, а затем нажмите Backspace, чтобы удалить ее. Вам следует выбрать «Переместить в корзину», потому что весь этот код больше не нужен.

Теперь, когда вы нажимаете Cmd+B для сборки проекта, вы получаете множество ошибок, потому что Swift больше не знает, что такое SwiftyBeaver. Это связано с тем, что CocoaPods предоставляет внешний модуль, который необходимо импортировать, но это легко сделать.

На самом деле все, что вам нужно сделать, это добавить import SwiftyBeaver в начало следующих файлов:

  • AppDelegate.swift
  • QuotesModel.swift
  • QuotesViewController.swift
  • ShowQuoteViewController.swift

И все — наш код снова скомпилируется. Потрясающе!

CocoaPods на практике

Хотя обновление нашего проекта для использования CocoaPods было достаточно простым, есть еще три вещи, которые вам, вероятно, необходимо знать в будущем.

Во-первых, если вы измените свой подфайл, чтобы добавить, удалить или обновить какие-либо модули, вам следует повторно запустить команду установки модуля. Это загрузит все модули, которые еще не доступны, и обновит ваше рабочее пространство, готовое к их использованию. С другой стороны, если вы хотите, чтобы CocoaPods обновлял ваши модули до последних версий, вы должны запустить обновление модуля .

Предупреждение. Запуск обновления модуля также обновит основной репозиторий спецификаций CocoaPods, поэтому это может занять около 30 секунд.

Во-вторых, когда мы добавили модуль SwiftyBeaver в наш файл Podfile, это означало, что нам нужна последняя версия SwiftyBeaver. Это нормально, пока вы что-то активно разрабатываете, но по мере приближения к выпуску вам может потребоваться переключиться на конкретную версию, чтобы избежать поломок.

CocoaPods позволяет вам запрашивать определенные версии модулей, если вы хотите — «дайте мне 1.0 и ничего больше», — но чаще вам понадобится ряд версий на основе семантического управления версиями. При использовании semver номера версий записываются как 1.0.3, где «1» — это старший номер, отражающий критические изменения, внесенные в код, «0» — младший номер, отражающий некритические дополнения к коду, а «3» — номер исправления, отражающий исправления ошибок. но никаких новых функций или критических изменений.

В CocoaPods вы можете запросить различные версии модулей в зависимости от ваших потребностей. Вероятно, наиболее распространенный вариант выглядит так:

Это означает «установить сетевую библиотеку Alamofire, убедившись, что у меня есть как минимум версия 4.7, но меня устраивает все, что ниже версии 5.0». Помните, что изменение основной версии означает, что критические изменения могут повлиять на ваше приложение, поэтому такое ограничение использования разумно.

Наконец, существуют некоторые разногласия по поводу того, следует ли включать код ваших модулей в вашу систему контроля версий или нет. Когда мы запустили pod install, CocoaPods создал каталог Pods, содержащий код для SwiftyBeaver. Если вы удалите эту папку и снова запустите установку модуля, вы вернете каталог Pods, так зачем включать его в систему управления версиями?

Как и во многих других вещах в программировании, здесь есть веские доводы за и против. Проверка модулей в системе управления исходным кодом означает, что ваш проект может быть собран сразу после проверки без каких-либо дополнительных команд, вы изолированы от проблем с GitHub (они случаются!) центральный репозиторий.

С другой стороны, не проверка модулей в системе управления версиями будет означать, что ваш репозиторий будет меньше, и вы устраните возможность проблем при объединении ветвей с разными файлами Pod.

Я провел небольшой опрос в Твиттере, и почти 2/3 людей сочли, что проверять свои модули в системе контроля версий — плохая идея, однако я думаю, что прагматичный подход, как обычно, состоит в том, чтобы делать то, что лучше всего подходит для вашей команды.

Что дальше?

Это вторая часть короткой серии статей об обновлении приложений для использования преимуществ современной инфраструктуры. Вы видели, как легко отказаться от импорта исходного кода вручную и вместо этого полагаться на диспетчер зависимостей, но в следующих статьях мы рассмотрим другие способы, которыми компьютерная автоматизация может помочь нам писать более качественный код — следите за обновлениями!

СПОНСОРЫ Обучение у всех разное. Для новичков это обучение выдержке. Для тех, кто учится в одиночку, это концепции обучения. Для юниоров это навыки прохождения собеседования. Бесплатный еженедельный информационный бюллетень Фернандо охватывает все этапы обучения.


Об авторе

Пол Хадсон — автор книги «Взлом с помощью Swift», самой полной в мире серии книг о Swift. Он также является редактором Swift Developer News, сопровождающим Swift Knowledge Base и спикером на мероприятиях Swift по всему миру. Если вам интересно, вы можете узнать больше здесь.

Читайте также: