Зависимость от СЗМ в разных проектах - PullRequest
0 голосов
/ 03 октября 2019

У меня есть рабочее пространство iOS из двух проектов:

Core - это проект с фреймворком. Кроме того, он имеет зависимость RxSwift через менеджер пакетов swift.

App - это приложение, которое имеет Core.framework как зависимость для встраивания и RxSwift как зависимость менеджера пакетов swift.

Iполучить эти предупреждения при запуске приложения:

objc[8296]: Class _TtC7RxSwiftP33_AB3B9E8806A71B46FB498A7594F5E0D919AnonymousDisposable is implemented in both /Users/andrey/Library/Developer/Xcode/DerivedData/App-dypyskhwoifkwagjjvtjblqppdnd/Build/Products/Debug-iphonesimulator/Core.framework/Core (0x10e092400) and /Users/andrey/Library/Developer/CoreSimulator/Devices/53D234F9-F917-46BA-B376-F28BA905EE9D/data/Containers/Bundle/Application/D4C69694-8515-44CF-B077-0CB3256D1F84/App.app/App (0x10bf95430). One of the two will be used. Which one is undefined.

Но если я попытаюсь получить доступ к MainScheduler.instance, который является статической переменной, я получу EXC_BAD_ACCESS сбой со стеком:

#0  0x000000010e7d5c07 in swift_checkMetadataState ()
#1  0x000000010e7d9a17 in checkTransitiveCompleteness(swift::TargetMetadata<swift::InProcess> const*)::$_18::operator()(swift::TargetMetadata<swift::InProcess> const*) const ()
#2  0x000000010e7d97ac in bool findAnyTransitiveMetadata<checkTransitiveCompleteness(swift::TargetMetadata<swift::InProcess> const*)::$_18&>(swift::TargetMetadata<swift::InProcess> const*, checkTransitiveCompleteness(swift::TargetMetadata<swift::InProcess> const*)::$_18&) ()
#3  0x000000010e7d96a6 in checkTransitiveCompleteness(swift::TargetMetadata<swift::InProcess> const*) ()
#4  0x000000010e7da278 in swift::MetadataCacheEntryBase<(anonymous namespace)::SingletonMetadataCacheEntry, int>::doInitialization(swift::ConcurrencyControl&, swift::MetadataCompletionQueueEntry*, swift::MetadataRequest) ()
#5  0x000000010e7d0078 in swift_getSingletonMetadata ()
#6  0x000000010b3bb9b8 in type metadata accessor for MainScheduler ()
#7  0x000000010af4b1c5 in static RxSchedulers.mainScheduler.getter 

ЧтоКак можно исправить эту ошибку?

1 Ответ

1 голос
/ 03 октября 2019

Проблема в том, что App модуль имеет две RxSwift зависимости, которые конфликтуют друг с другом. Первая является транзитивной зависимостью от Core.framework, а вторая находится внутри App модуля. Это вызывает этот сбой.

Еще одним признаком того, что у вас есть проблемы с двумя одинаковыми зависимостями, могут быть предупреждения при запуске приложения. Как этот:

objc[8296]: Class _TtC7RxSwiftP33_AB3B9E8806A71B46FB498A7594F5E0D919AnonymousDisposable is implemented in both /Users/andrey/Library/Developer/Xcode/DerivedData/App-dypyskhwoifkwagjjvtjblqppdnd/Build/Products/Debug-iphonesimulator/Core.framework/Core (0x10e092400) and /Users/andrey/Library/Developer/CoreSimulator/Devices/53D234F9-F917-46BA-B376-F28BA905EE9D/data/Containers/Bundle/Application/D4C69694-8515-44CF-B077-0CB3256D1F84/App.app/App (0x10bf95430). One of the two will be used. Which one is undefined.

В этом случае возможное исправление - удалить зависимость RxSwift из модуля App. Он не нарушает код, потому что RxSwift является транзитивной зависимостью и будет доступен внутри App модуля.

...