Разница между зависимостью podspec и декларацией podfile pod

У меня есть проект для cocoapod (назовем его «Main»), у которого есть зависимость с другим cocoapod (назовем его «Util»).

Я могу добавить Util в основной файл Podfile через «pod 'Util'» и указать его как зависимость в podspec через «s.dependency 'Util'».

Пока написан хотя бы один из них, мой тестовый проект для модуля работает нормально (хотя без зависимости в спецификации модуля выполнение команды «pod lib lint» возвращает ошибки)

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

Я хотел бы знать разницу между этими двумя подходами и есть ли хорошие практики, которые можно использовать, когда один модуль зависит от другого (тем более, что в конечном итоге я бы хотел использовать Main в качестве модуля для других проектов)


person Godfather    schedule 30.01.2015    source источник
comment
Я недавно столкнулся с этим же вопросом. Вы когда-нибудь понимали разницу между редактированием podspec и редактированием Podfile? В большей части документации, которую я вижу в Интернете, говорится, что вы должны отредактировать свой Podfile, но тогда мне интересно, в чем смысл podspec?   -  person stevendesu    schedule 11.09.2019


Ответы (2)


Можно сказать, что Podfile - это конфигурация вашего проекта, а Podspec - это конфигурация вашей библиотеки.

Подфайл:

  • Присутствует в корневом каталоге в виде файла с именем Podfile
  • Все приложения, которые хотят использовать Cocoapods (например, добавлять зависимости через pod 'library_name'), должны иметь Podfile. Вот куда идет эта информация.

Podspec (Спецификация библиотеки Pod):

  • Присутствует в корневом каталоге в виде файла с именем Library_name.podspec, отформатированного с использованием синтаксиса Ruby DSL.
  • Этот файл необходим для загрузки вашей библиотеки на Cocoapods.org (или использования ее через pod 'library_name'). Когда вы pod trunk push, вы нажимаете версию этого файла в формате JSON, например LibName.podpsec.json, например, здесь.
  • Библиотеки / пакеты также могут указывать Podfile поверх Podspec для конкретного кода, к которому разработчики не хотят получать доступ, когда нижележащие пользователи используют библиотеку.
  • У него есть ограничения по версиям, потому что для предоставления решения о выборе версии приложению, которое использует библиотеку (Podfile)

Отличия:

В вашем случае у вас просто есть код, которым вы ни с кем не делитесь. Следовательно, это не обязательно должна быть библиотека, вы можете просто иметь все в своем Podfile в качестве отдельной цели, и вам даже не нужен Podspec. Если вы хотите поделиться библиотекой с другими через Cocoapods, вам понадобится файл Podspec. Но если вы хотите повторно использовать main в разных проектах, тогда конфигурация, которую вы хотите передать этим проектам, должна быть в файле .podspec, и вы можете ссылаться на локальный каталог, содержащий podspec, в других ваших репозиториях.

Дополнительную информацию о Podspec можно найти в документации.

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

Примечание для будущих читателей

Я бы посоветовал вам выпустить свой пакет / библиотеку через Swift Package Manager вместо Cocoapods или Carthage. Все преимущества Cocoapods могут быть достигнуты с помощью SPM. Пользователи могут легко перейти на использование Swift Packages в своем проекте Xcode, поскольку он является встроенным, поэтому нет необходимости поддерживать другие менеджеры пакетов.

person Ben Butterworth    schedule 27.05.2021

Если я вас правильно понял, вам нужно и то, и другое.

Вы помещаете Util в Podfile Main, чтобы он мог его использовать и компилировать.

Вы помещаете Util в .podspec Main, чтобы любой, кто установил Main, автоматически получил Util вместе с Главная.

Также эта статья может оказаться полезной для вас, поскольку она показывает как получить дополнительные зависимости через subspec.

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

...
spec.default_subspec = 'Lite'

spec.subspec 'Lite' do |lite|
    # subspec for users who don't want the third party PayPal 
    # & Stripe bloat
end

spec.subspec 'PayPal' do |paypal|
    paypal.xcconfig =  
        { 'OTHER_CFLAGS' => '$(inherited) -DKITE_OFFER_PAYPAL' }
    paypal.dependency   'PayPal-iOS-SDK', '~> 2.4.2'
end

spec.subspec 'ApplePay' do |apple|
    apple.xcconfig =   
        { 'OTHER_CFLAGS' => '$(inherited) -DKITE_OFFER_APPLE_PAY' }
    apple.dependency      'Stripe', '2.2.0'
    apple.dependency      'Stripe/ApplePay'
end

позволяет использовать следующие 3 модуля:

pod "Kite-Print-SDK", "~> 1.0"
pod "Kite-Print-SDK/PayPal", "~> 1.0"
pod "Kite-Print-SDK/ApplePay", "~> 1.0"
person BFeher    schedule 18.01.2016