Мое приложение состоит из множества проектов (фреймворков), по одному для каждой основной функции, и общей фреймворк со всеми видами вещей, к которым мне нужно получить доступ во множестве моих функций.
Я использую диспетчер пакетов Swift Xcode 11 для добавления зависимостей.
Общая структура содержит зависимость RxSwift, которую я использую на протяжении всего проекта.
У меня возникают проблемы, когда я пытаюсь использовать RxTest в любой из моих фреймворков.
Если я добавлю RxTest через SPM непосредственно к цели теста и выполню тесты, я получу
не удалось отделить суперкласс «имя класса» от искаженного имени «другое имя класса»
и много
Класс «имя класса» реализован как в «общем пути платформы», так и в «пути целевой проверки»
где все эти классы связаны Rx. Ошибка «не удалось разобрать» приводит к сбою теста и возникает, только когда я пытаюсь инициализировать класс RxTest.
Если я добавлю RxTest в общую инфраструктуру, тесты будут работать нормально, но когда я запускаю приложение, я получаю
dyld: библиотека не загружена: @ rpath / XCTest.framework / XCTest
Это имеет смысл, потому что я добавляю тестовый фреймворк в не тестовый фреймворк, и это не то, что нужно делать.
В общем, я не смог получить конфигурацию, в которой и тесты, и приложение работают нормально. Либо приложение запускается, либо тесты запускаются.
Как я могу заставить это работать? Есть ли способ включить RxTest в общую инфраструктуру только тогда, когда я строю его на тестовой цели? Или RxTest должен быть включен только в тестовые объекты, и мне не хватает какой-либо конфигурации?
источник
Вероятно, ваша проблема в том, что библиотека использует статическое связывание вместо динамического связывания. В SwiftPM вы можете указать библиотеку как статическую или динамическую, если хотите, или вы можете просто позволить системе сборки решать, что делает большинство пакетов. Xcode, похоже, предпочитает статический подход при сборке с SwiftPM, что приводит к проблемам со сборкой, которые вы испытываете.
Если вы измените,
Package.swift
чтобы иметьRxTest
динамическую библиотеку, она должна работать. Вы можете легко проверить это путем клонированияRxSwift
и изменения этой строки:в:
а затем перетащить локальную копию
RxSwift
в навигатор проекта XCode. Затем он будет использовать вашу локальную копию пакета, а не клонированную Xcode.Сделав это, вы можете связать его с любыми нужными вам целями, и он должен работать. Если это действительно решит проблему, то ваши долгосрочные решения вероятны:
1) Иметь форк, который просто превращает его в динамическую библиотеку.
2) Убедить
RxSwift
сообщество изменить свои продукты на динамические или продавать динамические версии в дополнение к стандартным.3) Не используйте
RxTest
или подобные вещи в нескольких местах.Стоит также отметить, что Xcode 11.3 и более ранние версии не поддерживают архивирование с динамическими пакетами Swift. Так что если вы пойдете по динамическому маршруту, вам придется ждать Xcode 11.4.
источник