В нашем проекте XCode мы начали реализовывать модули ios как способ разделить нашу массивную кодовую базу на изолированные секции.
У нас есть модули для таких вещей, как:
Common
Product1
Product2
Product
App
Где приложение использует Product1, Product2 и Common, а Product1 использует Common, но Common ничего не знает о элементах более высокого уровня.
В XCode / Swift они реализованы как отдельные цели и генерируют интегрированные среды, которые импортируются вцели более высокого уровня.Это прекрасно работает для приложения.И приложение конечного продукта компилируется, не заботясь о том, что оно исходит от нескольких целей через каркасы зависимостей.
У нас также есть реальная платформа, которую мы разворачиваем для сторонних разработчиков.Ранее мы выбрали все файлы, которые будут существовать в платформе, и сделали их двойными членами цели фреймворка и цели приложения.
Теперь, однако, у нас есть такая зависимость, где модули нижнего уровня включены в качестве «целевых зависимостей» в xcode.
ProductFramework3rdParty
Product1
Common
ProductFramework прекрасно компилируется в симуляторе, который может быть встроен впример приложения barebones и работает как встроенный двоичный файл.Это и есть цель.
На устройстве, однако, выдается ошибка, из-за которой он не может найти общую платформу во время выполнения.
dyld: Library not loaded: @rpath/Common.framework/Common
Referenced from:
/private/var/mobile/Containers/Bundle/**/**/ProductFramework3rdParty/ProductFramework3rdParty
Reason: image not found
Он работает, только если я встраиваю общее, и в конечном итогемодули Product1 в стороннем приложении также.На самом деле это не является намеченной целью - предоставить клиенту нашу официальную структуру, а также внутренние модули для включения.В конечном счете, в нашем коде может быть 5-10 модулей, и мы хотели бы упаковать все это в единую распределенную среду.
Как мы можем это сделать?
Я безуспешно пытался изменить Mach-O для Common с динамического на статический, и он создал длинный список ошибок компоновки, которые я не смог преодолеть.А также раздувает Общее до 100 МБ, намного больше, чем предыдущий.