iOS Xcode SPM не смог разобрать суперкласс

9

Мое приложение состоит из множества проектов (фреймворков), по одному для каждой основной функции, и общей фреймворк со всеми видами вещей, к которым мне нужно получить доступ во множестве моих функций.

Я использую диспетчер пакетов Swift Xcode 11 для добавления зависимостей.

Общая структура содержит зависимость RxSwift, которую я использую на протяжении всего проекта.

У меня возникают проблемы, когда я пытаюсь использовать RxTest в любой из моих фреймворков.

Если я добавлю RxTest через SPM непосредственно к цели теста и выполню тесты, я получу

не удалось отделить суперкласс «имя класса» от искаженного имени «другое имя класса»

и много

Класс «имя класса» реализован как в «общем пути платформы», так и в «пути целевой проверки»

где все эти классы связаны Rx. Ошибка «не удалось разобрать» приводит к сбою теста и возникает, только когда я пытаюсь инициализировать класс RxTest.

Если я добавлю RxTest в общую инфраструктуру, тесты будут работать нормально, но когда я запускаю приложение, я получаю

dyld: библиотека не загружена: @ rpath / XCTest.framework / XCTest

Это имеет смысл, потому что я добавляю тестовый фреймворк в не тестовый фреймворк, и это не то, что нужно делать.

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

Как я могу заставить это работать? Есть ли способ включить RxTest в общую инфраструктуру только тогда, когда я строю его на тестовой цели? Или RxTest должен быть включен только в тестовые объекты, и мне не хватает какой-либо конфигурации?

dtmokada
источник

Ответы:

2

Xcode с зависимостями SPM не может обрабатывать одну и ту же зависимость SPM в нескольких целях, которые прямо сейчас зависят друг от друга. Каждая зависимость должна быть только в одной цели на данный момент. На данный момент я не знаю, почему, но я попытаюсь исследовать больше и сообщить об ошибке, если она еще не зарегистрирована.

Зденек Топич
источник
Привет, удачи узнать больше?
janh
Нашли что-нибудь об этом?
Боген
Пока ничего нет :) Проблема в том, что она статически связывает зависимости в целях.
Зденек Топич
0

Вероятно, ваша проблема в том, что библиотека использует статическое связывание вместо динамического связывания. В SwiftPM вы можете указать библиотеку как статическую или динамическую, если хотите, или вы можете просто позволить системе сборки решать, что делает большинство пакетов. Xcode, похоже, предпочитает статический подход при сборке с SwiftPM, что приводит к проблемам со сборкой, которые вы испытываете.

Если вы измените, Package.swiftчтобы иметь RxTestдинамическую библиотеку, она должна работать. Вы можете легко проверить это путем клонирования RxSwiftи изменения этой строки:

.library(name: "RxTest", targets: ["RxTest"]),

в:

.library(name: "RxTest", type: .dynamic, targets: ["RxTest"]),

а затем перетащить локальную копию RxSwiftв навигатор проекта XCode. Затем он будет использовать вашу локальную копию пакета, а не клонированную Xcode.

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

1) Иметь форк, который просто превращает его в динамическую библиотеку.

2) Убедить RxSwiftсообщество изменить свои продукты на динамические или продавать динамические версии в дополнение к стандартным.

3) Не используйте RxTestили подобные вещи в нескольких местах.


Стоит также отметить, что Xcode 11.3 и более ранние версии не поддерживают архивирование с динамическими пакетами Swift. Так что если вы пойдете по динамическому маршруту, вам придется ждать Xcode 11.4.

bscothern
источник
Клонирование и изменение каждой зависимости не кажется мне решением проблемы. Большинство пакетов используют тип по умолчанию, который, как я полагаю, несколько автоматический и по какой-то причине выбирает статическое связывание каждый раз. Я ожидал бы, что, поскольку пакет связан в нескольких целях, он решил бы связать его динамически.
Зденек Топич
Я это боль. Я согласен, что динамика будет ожидаемым поведением здесь. Лучшее, что мы можем сделать, чтобы изменить это - подать запрос обратной связи в Apple.
bscothern