Какие преимущества и недостатки у менеджера зависимостей CocoaPods?

Ответ

Преимущества:

  • Простота использования: Установка через gem и базовые команды pod install/pod update.
  • Огромная экосистема: Центральный репозиторий (CocoaPods Trunk) содержит тысячи библиотек для iOS/macOS.
  • Прозрачная интеграция: Создает workspace Xcode, автоматически настраивая пути поиска заголовков и флаги линковки.
  • Гибкость Podfile: Поддержка различных источников (git, локальный путь), специфичных для цели зависимостей и настраиваемых скриптов сборки.

Недостатки:

  • Скорость: Может работать медленно на больших проектах из-за необходимости загружать и компилировать исходный код зависимостей.
  • Зависимость от Ruby: Проблемы совместимости с системным Ruby на новых версиях macOS, требуют использования менеджеров версий (rbenv, RVM).
  • Монорепозиторий: Централизованный репозиторий Trunk представляет собой единую точку отказа.
  • Раздувание проекта: Каждая зависимость добавляет свой .xcodeproj в workspace, что может замедлить открытие проекта в Xcode.

Пример Podfile с настройками:

platform :ios, '13.0'
# Отключить создание фреймворков для статических библиотек
use_frameworks! :linkage => :static

target 'MyProductionApp' do
  # Библиотека с семантическим версионированием
  pod 'Alamofire', '~> 5.6'
  # Библиотека из ветки Git
  pod 'MyInternalKit', :git => 'https://internal.git/MyInternalKit.git', :branch => 'develop'
end

target 'MyProductionAppTests' do
  # Зависимость только для тестов
  pod 'Quick'
  pod 'Nimble'
end

# Пост-установочный хук для настройки сборки
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
    end
  end
end

Ответ 18+ 🔞

А, слушай-ка, про этот ваш CocoaPods! Ну, инструмент, конечно, культовый, как старый добрый «Запорожец» — все на нём ездили, но и ругаться успели, блядь, до охуения.

Чем хорош, сука:

  • Включил и поехал: Сказал gem install, потом pod install — и вроде как всё готово. Не надо мозг ебать с линковкой, как в старые добрые.
  • Библиотек — овердохуища: Зашёл в их центральный магазин (Trunk), а там всё, что душе угодно, от сетевых запросов до анимаций. Нашёл — установил.
  • Само всё прикрутит: Создаст тебе workspace в Xcode, натыкает флажков, заголовочные пути пропишет. Сиди и коди, блядь.
  • Podfile — хитрая жопа: Можно из гита тащить, с ветки конкретной, можно только для тестов цели подцепить. Гибко, ёпта.

А теперь про говно, которое вылезает:

  • Скорость — пиздец: Особенно когда проект раздуется. Каждый раз pod update — это как ждать, пока бабушка через дорогу перейдёт. Всё качает, всё компилирует заново.
  • Ruby — ёперный театр: На новой маке эта тварь с системным Ruby вечно косячит. То версия не та, то права. Приходится ставить rbenv и танцевать с бубном, блядь.
  • Одна точка — и всем пиздец: Все библиотеки прут через их центральный репозиторий. Упал он — и ты сидишь с голым проектом, как дурак.
  • Xcode захлебнётся: Каждая библиотека — свой .xcodeproj в воркспейсе. Открываешь проект — а он минуту думает, мартышлюшка.

Вот, смотри, как в Podfile накосячить можно:

platform :ios, '13.0'
# Говорим: не делай фреймворки, оставь статическими библиотеками, а то нахуй не надо
use_frameworks! :linkage => :static

target 'MyProductionApp' do
  # Берём Alamofire, но только до следующей мажорной версии, а то ещё наебнут
  pod 'Alamofire', '~> 5.6'
  # А эту либу тянем прямо с гита, с ветки для распиздяев-разработчиков
  pod 'MyInternalKit', :git => 'https://internal.git/MyInternalKit.git', :branch => 'develop'
end

target 'MyProductionAppTests' do
  # Это только для тестов, чтобы прод не засрать
  pod 'Quick'
  pod 'Nimble'
end

# А это такая магия, чтобы после установки всем таргетам впендюрить одну и ту же версию iOS
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
    end
  end
end

В общем, инструмент как инструмент. Для старта — огонь, простота. Но когда проект вырастает, начинаешь чувствовать все его косяки, блядь, и волосы дыбом встают.