Подтвердить что ты не робот

Лучшая практика для зависимостей статической библиотеки

Я пишу статическую библиотеку, которая имеет зависимости от других библиотек (в моем случае SBJSON и ASIHTTPRequest).

Если я компилирую эти внешние зависимости в свою библиотеку, то я не могу связать их с другими библиотеками, в которых эти классы скомпилированы. Поскольку моя цель - создать набор статических библиотек для моей компании, которые можно импортировать в любое новое приложение, компиляция этих зависимостей в библиотеке, очевидно, не является вариантом.

Есть ли у кого-нибудь советы/рекомендации по созданию набора общих статических библиотек с общими зависимостями?

4b9b3361

Ответ 1

Вы можете использовать диспетчер зависимостей, например CocoaPods или VendorKit, чтобы вытащить нужную библиотеку, а также все ее транзитивные зависимости - библиотеки, от которых зависит библиотека.

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

CocaoPods имеет хороший способ управления этим, вытаскивая все библиотеки в качестве источника, а затем компилируя их все в одну статическую библиотеку - в отдельный проект. Затем он соединяется с вашим проектом через рабочее пространство.

VendorKit использует аналогичный подход, но использует один файл проекта.

Оба CocoaPods и VendorKit позволяют легко публиковать вашу библиотеку в центральном репозитории. CocaoPods позволяет вам поддерживать свою собственную или общедоступную вилку центрального репо, если хотите, то есть в качестве репозитория предприятия.

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

[Изменить]: По состоянию на январь 2013 года появился новый соперник - плагин Maven Xcode.

Ответ 2

Статическая библиотека - это всего лишь коллекция объектных файлов. В вашем случае вы не хотите, чтобы объектные файлы для SBJSON и ASIHTTPRequest были включены в вашу статическую библиотеку - вы хотите оставить это задание в конечном приложении. Единственное, что нужно для вашей статической библиотеки, это файлы заголовков для SBJSON и ASIHTTPRequest.

Поскольку эти проекты распространяются как исходные файлы (файлы .h и .m), вам просто нужно сообщить Xcode не создавать файлы SBM SBJSON/ASIHTTPRequest для вашей цели статической библиотеки.

Самый простой способ сделать это - импортировать файлы заголовков .h для этих проектов в проект Xcode. В качестве альтернативы вы можете импортировать файлы .h и .m, но убедитесь, что файлы .m не включены в фазу сборки "Компиляция источников" вашей целевой статической библиотеки.

Некоторые другие актуальные темы SO:

Как я могу избежать дублирования символа " ошибки в xcode с общими статическими библиотеками?

Дублирующий символ: включить статический lib A в статическом lib B, также включить lib A и B в проект XCode