Статьи

Управление частными стручками с помощью CocoaPods

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

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

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

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

1
2
3
4
5
6
platform :ios, ‘8.0’
 
target ‘Testing’ do
  pod ‘AFNetworking’, ‘2.6.0 ‘
  pod ‘SVProgressHUD’, ‘~> 1.1’
end
1
2
3
4
5
6
7
8
source ‘https://github.com/CocoaPods/Specs.git’
 
platform :ios, ‘8.0’
 
target ‘Testing’ do
  pod ‘AFNetworking’, ‘2.6.0 ‘
  pod ‘SVProgressHUD’, ‘~> 1.1’
end

Если вы никогда не создавали и не вносили вклад в модуль, то вам может быть интересно, что такое репозиторий спецификаций? Репозиторий specs — это не что иное, как репозиторий, содержащий коллекцию спецификаций pod, файлов с расширением .podspec или .podspec.json .

Как следует из названия, репозиторий specs не содержит исходных файлов для модулей. Вы можете просмотреть репозиторий основных спецификаций CocoaPods на GitHub . Если на вашем компьютере установлен CocoaPods, то на вашем компьютере уже имеется копия репозитория основных спецификаций.

В процессе установки CocoaPods клонирует репозиторий основных спецификаций в вашу домашнюю папку. Вы можете найти его в ~ / .cocoapods / repos / master .

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

Вы можете создать бесплатную учетную запись GitHub, чтобы следить за ней, но имейте в виду, что вы можете создавать только публичные репозитории с бесплатной учетной записью. Если у вас есть библиотека с открытым исходным кодом, рекомендуется опубликовать спецификацию pod в репозитории master specs, которая управляется командой CocoaPods. Вы ничего не получите, создав отдельный публичный репозиторий спецификаций.

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

Следующий шаг — это рассказать CocoaPods о репозитории specs, который мы только что создали. Это можно сделать, выполнив следующую команду из командной строки.

1
pod repo add tutspods https://github.com/bartjacobs/tutspods.git

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

Каждый раз, когда вы добавляете репозиторий спецификаций, CocoaPods клонирует репозиторий на ваш компьютер. Вы можете убедиться в этом, перейдя в ~ / .cocoapods / repos . Каталог теперь должен содержать два репозитория спецификаций: репозиторий основных спецификаций и репозиторий спецификаций tutspods . Помимо папки .git, каталог tutspods пуст, так как мы еще не добавили никаких спецификаций.

Не так давно Энди Обусек написал отличный урок о создании вашего первого модуля. Если вы никогда не создавали модуль — открытый или закрытый — тогда я рекомендую сначала прочитать статью Энди. Я не буду повторять то, что Энди написал в этом уроке.

В качестве примера я создал крошечную библиотеку TSPTableView , которая содержит специальный подкласс UITableView . Чтобы создать спецификацию модуля для библиотеки, выполните следующую команду в корне библиотеки.

1
pod create spec TSPTableView

Запустив указанную выше команду, CocoaPods создает файл с именем TSPTableView.podspec . Откройте файл в текстовом редакторе и заполните необходимые поля. Когда вы закончите, запустите pod spec lint для проверки спецификации pod. Если спецификация модуля не прошла проверку, вы не сможете отправить спецификацию в хранилище спецификаций.

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

1
pod repo push tutspods TSPTableView.podspec

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

Теперь мы можем использовать TSPTableView в новом проекте. Создайте проект в XCode и добавьте Podfile в корне проекта, запустив pod init из командной строки. Вот как может выглядеть подфайл, когда вы закончите.

1
2
3
4
5
platform :ios, ‘8.0’
 
target ‘MyAmazingApp’ do
  pod ‘TSPView’
end

Запустите pod install из командной строки, чтобы установить зависимости, перечисленные в Podfile проекта. Вы тоже столкнулись с проблемой? Я вижу следующую ошибку.

1
2
3
4
5
pod install
Updating local specs repositories
 
Analyzing dependencies
[!] Unable to find a specification for `TSPTableView`

Вывод говорит нам, что CocoaPods сначала обновляет локальные репозитории спецификаций. Это означает, что репозитории в каталоге ~ / .cocoapods / repos обновляются, внося любые изменения.

CocoaPods делает это, чтобы обеспечить наличие последней версии спецификаций, которые хранятся в репозиториях. Если мы посмотрим на каталог ~ / .cocoapods / repos / tutspods , то увидим, что спецификация модуля для модуля TSPTableView там, как мы и ожидали. Почему CocoaPods не может найти спецификацию модуля для TSPTableView ?

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

1
2
3
4
5
6
7
8
source ‘https://github.com/bartjacobs/tutspods.git’
source ‘https://github.com/CocoaPods/Specs.git’
 
platform :ios, ‘8.0’
 
target ‘MyAmazingApp’ do
  pod ‘TSPTableView’
end

Запустите pod install еще раз, чтобы установить зависимости, перечисленные в Podfile проекта. Команда должна теперь успешно завершиться, как показано ниже. В настоящее время я использую CocoaPods 0.38.2, поэтому выходные данные могут немного отличаться, если вы используете другую версию CocoaPods.

01
02
03
04
05
06
07
08
09
10
pod install
Updating local specs repositories
 
Analyzing dependencies
Downloading dependencies
Installing TSPTableView (0.0.1)
Generating Pods project
Integrating client project
 
[!] Please close any current Xcode sessions and use `MyAmazingApp.xcworkspace` for this project from now on.

Обратите внимание, что порядок, в котором вы перечисляете репозитории спецификаций в Podfile , важен. Например, если вы разветвили общедоступный модуль, изменили его и создали частный модуль для вилки с тем же именем, у вас возникнет конфликт имен.

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

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