Лучшая практика для зависимостей статической библиотеки
Я пишу статическую библиотеку, которая имеет зависимости от других библиотек (в моем случае SBJSON и ASIHTTPRequest).
Если я компилирую эти внешние зависимости в свою библиотеку, то я не могу связать их с другими библиотеками, в которых эти классы скомпилированы. Поскольку моя цель - создать набор статических библиотек для моей компании, которые можно импортировать в любое новое приложение, компиляция этих зависимостей в библиотеке, очевидно, не является вариантом.
Есть ли у кого-нибудь советы/рекомендации по созданию набора общих статических библиотек с общими зависимостями?
Ответы
Ответ 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
Ответ 3
Создайте статическую структуру для каждой библиотеки. Документируйте зависимости в файлах заголовков.
[Изменить]: теперь я предпочитаю использовать Cocoapods. См. fooobar.com/info/174655/...