Mon application est composée de nombreux projets (frameworks), un pour chaque fonctionnalité principale et un framework commun avec toutes sortes de choses auxquelles j'ai besoin d'accéder dans plusieurs de mes fonctionnalités.
J'utilise Swift Package Manager de Xcode 11 pour ajouter des dépendances.
Le cadre commun contient une dépendance RxSwift, que j'utilise tout au long du projet.
Je rencontre des problèmes lorsque j'essaie d'utiliser RxTest dans l'un de mes cadres de fonctionnalités.
Si j'ajoute RxTest via SPM à la cible de test directement et exécute les tests, j'obtiens
n'a pas réussi à démêler la superclasse de «nom de classe» du nom mutilé «autre nom de classe»
et beaucoup
La classe «nom de classe» est implémentée à la fois dans le «chemin du framework commun» et dans le «chemin cible de test»
où toutes ces classes sont liées à Rx. L'erreur «n'a pas réussi à démêler» plante le test et se produit uniquement lorsque j'essaie d'initialiser une classe RxTest.
Si j'ajoute RxTest au framework commun, les tests fonctionnent bien, mais lorsque j'exécute l'application, j'obtiens
dyld: bibliothèque non chargée: @ rpath / XCTest.framework / XCTest
Ce qui est logique, car j'ajoute un framework de test à un framework non-test, et ce n'est pas quelque chose de bien à faire.
Donc, fondamentalement, je n'ai pas pu obtenir une configuration où les tests et l'application fonctionnent correctement. Soit l'application s'exécute, soit les tests s'exécutent.
Comment puis-je faire fonctionner cela? Existe-t-il un moyen d'inclure RxTest dans le cadre commun uniquement lorsque je le crée sur une cible de test? Ou RxTest ne devrait-il être inclus que sur les cibles de test et il me manque une configuration?
la source
Votre problème est probable que la bibliothèque utilise une liaison statique au lieu d'une liaison dynamique. Dans SwiftPM, vous pouvez spécifier une bibliothèque comme étant statique ou dynamique si vous le souhaitez ou vous pouvez simplement laisser le système de construction décider de ce que font la plupart des packages. Xcode semble favoriser l'approche statique lors de sa construction avec SwiftPM, ce qui entraîne les problèmes de construction que vous rencontrez.
Si vous modifiez
Package.swift
pour avoirRxTest
une bibliothèque dynamique, cela devrait plutôt fonctionner. Vous pouvez facilement tester cela en clonantRxSwift
et en modifiant cette ligne:dans:
puis en faisant glisser la copie locale de
RxSwift
dans votre navigateur de projet Xcode. Il utilisera ensuite votre copie locale du package au lieu de celle clonée par Xcode.Une fois que vous faites cela, vous pouvez le lier à toutes les cibles dont vous avez besoin et cela devrait fonctionner. Si cela résout réellement le problème, vos solutions à long terme sont probables:
1) Ayez un fork qui le change simplement en bibliothèque dynamique.
2) Convaincre la
RxSwift
communauté de changer ses produits en versions dynamiques ou de vendre des versions dynamiques en plus des versions par défaut.3) N'utilisez pas
RxTest
ou des choses similaires à plusieurs endroits.Il convient également de noter que Xcode 11.3 et versions antérieures ne prennent pas en charge l'archivage avec les packages Swift dynamiques. Donc, si vous descendez la route dynamique, vous devrez attendre Xcode 11.4.
la source