Большинство из нас ежедневно используют библиотеки с открытым исходным кодом. С CocoaPods управление зависимостями в проекте Какао практически безболезненно. Однако в некоторых ситуациях проект зависит от библиотеки или среды с закрытым исходным кодом, которая не является общедоступной. Вы все еще можете использовать CocoaPods в таких ситуациях. CocoaPods прекрасно работает как с закрытыми, так и с открытыми библиотеками.
Чтобы это работало, вам нужно создать частный репозиторий спецификаций. После того, как вы его настроите, вы даже не заметите разницы между публичными и частными зависимостями, потому что CocoaPods позаботится о мельчайших подробностях для вас. В этом руководстве вы узнаете, как настроить хранилище частных спецификаций для управления частными библиотеками.
1. Введение
Если вы использовали только 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 .
2. Создание хранилища спецификаций
Я обычно использую GitHub для размещения Git-репозиториев, так что именно эту платформу я буду использовать для этого урока. Не имеет значения, где вы размещаете репозиторий спецификаций, если он доступен для всех в вашей команде.
Вы можете создать бесплатную учетную запись GitHub, чтобы следить за ней, но имейте в виду, что вы можете создавать только публичные репозитории с бесплатной учетной записью. Если у вас есть библиотека с открытым исходным кодом, рекомендуется опубликовать спецификацию pod в репозитории master specs, которая управляется командой CocoaPods. Вы ничего не получите, создав отдельный публичный репозиторий спецификаций.
Первое, что нам нужно сделать, — это создать частный репозиторий на GitHub для приватных спецификаций, которые мы добавим позже. Я назвал мои Tutspods . GitHub предложит клонировать репозиторий на вашу машину, но это не обязательно. CocoaPods будет клонировать хранилище спецификаций для вас, как только вы добавите его в CocoaPods. Это то, что мы сделаем на следующем шаге.
3. Добавление репозитория в CocoaPods
Следующий шаг — это рассказать CocoaPods о репозитории specs, который мы только что создали. Это можно сделать, выполнив следующую команду из командной строки.
1
|
pod repo add tutspods https://github.com/bartjacobs/tutspods.git
|
Вы можете заметить, что команда похожа на добавление удаленного в Git-репозиторий. Убедитесь, что вы помните имя, которое вы даете хранилищу спецификаций, в данном случае tutspods . Нам это понадобится чуть позже.
Каждый раз, когда вы добавляете репозиторий спецификаций, CocoaPods клонирует репозиторий на ваш компьютер. Вы можете убедиться в этом, перейдя в ~ / .cocoapods / repos . Каталог теперь должен содержать два репозитория спецификаций: репозиторий основных спецификаций и репозиторий спецификаций tutspods . Помимо папки .git, каталог tutspods пуст, так как мы еще не добавили никаких спецификаций.
4. Создание частного стручка
Не так давно Энди Обусек написал отличный урок о создании вашего первого модуля. Если вы никогда не создавали модуль — открытый или закрытый — тогда я рекомендую сначала прочитать статью Энди. Я не буду повторять то, что Энди написал в этом уроке.
В качестве примера я создал крошечную библиотеку TSPTableView , которая содержит специальный подкласс UITableView
. Чтобы создать спецификацию модуля для библиотеки, выполните следующую команду в корне библиотеки.
1
|
pod create spec TSPTableView
|
Запустив указанную выше команду, CocoaPods создает файл с именем TSPTableView.podspec . Откройте файл в текстовом редакторе и заполните необходимые поля. Когда вы закончите, запустите pod spec lint
для проверки спецификации pod. Если спецификация модуля не прошла проверку, вы не сможете отправить спецификацию в хранилище спецификаций.
5. Перенос спецификации в репозиторий спецификаций
Если спецификация модуля проходит проверку, пришло время отправить ее в хранилище приватных спецификаций, которое вы создали ранее. Это можно сделать, выполнив следующую команду из командной строки.
1
|
pod repo push tutspods TSPTableView.podspec
|
Ключевым является то, что вы используете то же имя, которое ранее использовали для добавления хранилища приватных спецификаций в CocoaPods. Последний аргумент — это путь к спецификации модуля, который вы отправляете в хранилище спецификаций.
6. Использование частного стручка
Теперь мы можем использовать 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.