CocoaPods Trunk — це серверний сервіс екосистеми CocoaPods, призначений для публікації, хостингу та керування pod-бібліотеками. Trunk замінив застарілий механізм публікації через GitHub-репозиторії та форки, надавши централізовану інфраструктуру з автентифікацією, керуванням сесіями, версіонуванням та валідацією перед публікацією. Розробники iOS та macOS використовують pod trunk push для надсилання бібліотек у публічний реєстр.
Головне
pod trunk register із підтвердженням emailpod trunk push проходить валідацію, лінтинг та завантаження в реєстрpod trunk me, pod trunk add-owner, pod trunk deprecate для адміністрування подівCocoaPods Trunk — це серверна інфраструктура, запущена у 2015 році для централізованої публікації pod-бібліотек. До появи Trunk кожен pod поширювався через Git-репозиторій: розробнику потрібно було створити публічний репозиторій, додати podspec-файл і надіслати Pull Request до центрального репозиторію CocoaPods/Specs. Такий підхід вимагав ручної модерації та створював затримки під час публікації оновлень.
Trunk вирішив ці проблеми, надавши єдиний API для публікації, оновлення та керування подами. Сервіс включає чотири ключові компоненти:
Архітектура Trunk побудована на стеку Ruby on Rails з базою даних PostgreSQL. Сервіс використовує HTTP API з JSON-форматом для всіх операцій, а CLI-клієнт pod trunk є частиною дистрибутива CocoaPods і встановлюється разом з основним гемом cocoapods.
На сьогодні через Trunk опубліковано понад 100 000 подів, загальна кількість завантажень перевищує 50 мільярдів. Щодня сервіс обробляє тисячі запитів на публікацію та оновлення бібліотек від розробників по всьому світу.
Перед публікацією пода необхідно пройти реєстрацію в Trunk. Процес складається з одного кроку — команди pod trunk register:
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, розробка iOS'Після виконання команди на вказаний email приходить лист з посиланням для підтвердження. Перехід за посиланням активує обліковий запис і створює токен сесії, який зберігається в системній зв'язці ключів (Keychain на macOS, gnome-keyring або еквівалент на Linux). Токен автоматично використовується при всіх подальших операціях pod trunk.
Параметр --description необов'язковий, але рекомендований — він допомагає ідентифікувати сесію під час перегляду активних сесій через pod trunk me. Якщо ви працюєте з кількох машин (робоча станція, CI-сервер), опис дозволить відрізнити одну сесію від іншої.
Для перевірки статусу автентифікації використовується команда:
pod trunk meВивід показує email, ім'я, список ваших подів (якщо вже публікували) та активні сесії. Приклад результату:
- Name: Your Name
- Email: your@email.com
- Since: 2024-03-15 10:30 UTC
- Pods:
- MyLibrary
- AnotherPod
- Sessions:
- 2024-03-15 10:30 UTC - MacBook Pro, разработка iOSНа CI-серверах (GitHub Actions, GitLab CI, Jenkins) автентифікація виконується через токен, переданий через змінну середовища COCOAPODS_TRUNK_TOKEN. Токен можна отримати командою:
pod trunk me --token-onlyЦей токен зберігається в налаштуваннях CI як секретна змінна, і на етапі публікації використовується без повторної реєстрації. Приклад для GitHub Actions:
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}Важливо: токен дає повний доступ до керування подами, прив'язаними до облікового запису. Ніколи не публікуйте його у відкритих репозиторіях і не передавайте третім особам. При компрометації токен можна відкликати через pod trunk remove-session або видалити всі сесії через панель керування на сайті CocoaPods.
Podspec-файл (.podspec або .podspec.json) — це маніфест бібліотеки, що містить метадані, залежності, інформацію про платформи та вихідний код. Trunk використовує цей файл для валідації та реєстрації пода. Мінімальний podspec для публікації виглядає так:
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'Короткий опис бібліотеки'
s.description = 'Розгорнутий опис з поясненням можливостей'
s.homepage = 'https://github.com/username/MyLibrary'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Your Name' => 'your@email.com' }
s.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => s.version.to_s }
s.source_files = 'Sources/**/*.{swift,h,m}'
s.platform = :ios, '12.0'
s.swift_version = '5.7'
endКлючові поля podspec:
MAJOR.MINOR.PATCH. Trunk не приймає повторну публікацію тієї ж версії — потрібно збільшити номер.MIT, Apache-2.0, BSD або іншу відкриту ліцензію.Перед публікацією podspec необхідно перевірити на коректність за допомогою лінтера:
pod lib lint MyLibrary.podspecЛінтер перевіряє синтаксис, наявність обов'язкових полів, коректність шляхів до файлів та розв'язність залежностей. Якщо в процесі лінтингу використовуються приватні джерела, додається прапорець --sources. Для пропуску завантаження мережі (тільки локальна перевірка) використовується прапорець --local-only.
Основна команда для публікації пода — pod trunk push. Вона передає podspec-файл на сервер Trunk, де проходить повну валідацію та реєструється в публічному реєстрі. Синтаксис:
pod trunk push MyLibrary.podspecПрапорець --allow-warnings дозволяє публікацію за наявності попереджень. За замовчуванням будь-які попередження блокують публікацію. Якщо бібліотека має відомі попередження, які не впливають на функціональність, можна використовувати цей прапорець. Важливо: помилки завжди блокують публікацію, незалежно від прапорців.
Прапорець --synchronous робить запит синхронним — термінал очікує завершення валідації на сервері. За замовчуванням команда повертає керування одразу після відправки, а сервер обробляє публікацію асинхронно. Синхронний режим корисний у CI/CD, коли наступний крок пайплайну залежить від успішності публікації.
Прапорець --skip-import-validation пропускає перевірку імпорту бібліотеки в тестовий проект. Це прискорює публікацію, але не гарантує, що бібліотека дійсно компілюється. Використовуйте цей прапорець лише якщо впевнені в коректності збірки.
Приклад публікації з типовими опціями:
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationПісля успішної публікації Trunk повертає JSON з деталями:
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryБібліотека стає доступною для встановлення через Podfile будь-якого iOS- або macOS-проекту. Зазвичай дані в пошуковому індексі CocoaPods оновлюються протягом кількох хвилин, але в рідкісних випадках індексація може зайняти до години.
Важливе обмеження: одного разу опубліковану версію пода не можна видалити. Це зроблено для запобігання поломкам у проектах, які вже використовують цю версію. Якщо публікація пройшла з помилкою, можна опублікувати наступну версію з виправленням, але відкат неможливий. Виняток — pod trunk delete, доступний лише співробітникам CocoaPods і застосовується в крайніх випадках (порушення ліцензії, шкідливий код).
CocoaPods Trunk надає кілька команд для адміністрування опублікованих подів:
Для передачі прав на публікацію пода іншому розробнику використовується команда:
pod trunk add-owner MyLibrary developer@email.comПісля виконання новий власник отримує повний доступ до керування подом: публікація нових версій, додавання та видалення інших власників, позначка пода як застарілого. Власником може бути будь-який зареєстрований користувач Trunk — попередня реєстрація обов'язкова.
Якщо розробник залишив проект або більше не повинен мати доступ до пода:
pod trunk remove-owner MyLibrary developer@email.comВидалити власника може лише поточний власник. Не можна видалити останнього власника пода — спочатку потрібно додати нового. Це запобігає ситуації, коли под залишається без власника і стає безхазяйним.
Якщо бібліотека більше не підтримується, її можна позначити як застарілу (deprecated). Це не видаляє под з реєстру, але додає попередження користувачам під час встановлення:
pod trunk deprecate MyLibraryОпціонально можна вказати под-заміну:
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryПід час встановлення застарілого пода CocoaPods виводить попередження в термінал і рекомендує перейти на вказану заміну. Це коректний спосіб завершити підтримку бібліотеки, не порушуючи збірки існуючих проектів.
Інформація про под доступна через команду pod trunk info:
pod trunk info MyLibraryКоманда показує всі версії пода, дати публікації, список власників та статус (активний/застарілий). Для перегляду деталей конкретної версії використовується pod spec cat MyLibrary 0.1.0.
Під час роботи з Trunk розробники часто стикаються з типовими помилками. Розглянемо найпоширеніші:
Симптом: [!] Authentication failed. You need to register a session first.
Причина: Відсутній або закінчився термін дії токена сесії. Токени мають обмежений термін дії (за замовчуванням 30 днів без активності).
Рішення: Повторно виконати pod trunk register your@email.com 'Your Name'. Якщо ви використовуєте CI, перевірте актуальність змінної COCOAPODS_TRUNK_TOKEN і при необхідності згенеруйте новий токен.
Симптом: [!] You have already pushed version 0.1.0 for MyLibrary.
Причина: Спроба повторної публікації існуючої версії. Trunk не дозволяє перезаписувати версії.
Рішення: Збільшити версію в podspec відповідно до семантичного версіонування. Якщо ви помилилися в podspec, опублікуйте наступну версію з виправленням.
Симптом: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
Причина: Неправильно вказано шлях до вихідних файлів у полі source_files.
Рішення: Перевірити шляхи в podspec, виконати pod lib lint локально до усунення всіх помилок, потім повторити публікацію. Використовуйте глоб-патерни: Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift.
Симптом: [!] Connection to trunk.cocoapods.org failed. Timeout.
Причина: Проблеми з мережею або тимчасова недоступність сервера Trunk.
Рішення: Перевірити доступність сервера: curl -I https://trunk.cocoapods.org. Якщо сервер відповідає, повторити команду через кілька хвилин. Можливо, вашу IP-адресу заблоковано — спробуйте з іншого з'єднання або через VPN.
Симптом: [!] You do not have permission to push to MyLibrary.
Причина: Ви не є власником пода. Це відбувається, якщо хтось уже зареєстрував под з таким іменем.
Рішення: Зв'язатися з поточним власником пода (дізнатися можна через pod trunk info MyLibrary) і попросити додати вас через pod trunk add-owner. Якщо ім'я пода зайняте, розгляньте альтернативне ім'я.
Часті запитання
Старий спосіб вимагав ручного Pull Request у репозиторій CocoaPods/Specs. Trunk автоматизує процес: ви виконуєте одну команду pod trunk push, і сервер сам перевіряє podspec, додає його в реєстр та оновлює пошуковий індекс. Trunk також додав керування доступом (множинні власники), токени сесії та централізоване зберігання метаданих.
Це неможливо — Trunk забороняє видалення опублікованих версій для збереження цілісності залежностей. Якщо версія містить критичну помилку, опублікуйте нову версію з виправленням і позначте проблемну версію як застарілу через pod trunk deprecate. Повне видалення доступне лише адміністраторам CocoaPods у виняткових випадках.
Ні, поле s.author обов'язково має містити email. Trunk використовує його для прив'язки пода до облікового запису власника. Адреса має збігатися з email, вказаним під час реєстрації через pod trunk register. Якщо email у podspec відрізняється, публікація буде відхилена.
Зазвичай под з'являється в пошуку CocoaPods протягом 5–15 хвилин. У рідкісних випадках індексація може зайняти до години. При цьому под доступний для встановлення через Podfile одразу після успішної відповіді від Trunk — потрібно лише вказати точну версію або діапазон у Podfile.
Якщо у вас є активна сесія (токен не закінчився), змініть email через pod trunk register new@email.com — нова реєстрація прив'яже поди до нової адреси. Якщо сесія закінчилася, зверніться до підтримки CocoaPods через GitHub Issues. Доказом володіння подом може служити можливість створити коміт у Git-репозиторії пода.
Підсумки
pod trunk register з email-підтвердженням та автоматичним збереженням токена сесіїpod trunk push проходить валідацію на сервері; один раз опубліковану версію не можна видалитиpod trunk add-owner і pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN для автоматичної публікації в пайплайнахМи розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.