iOS Xcode SPM n'a pas réussi à démêler la superclasse

9

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?

dtmokada
la source

Réponses:

2

Xcode avec les dépendances SPM ne peut pas gérer la même dépendance SPM dans plusieurs cibles qui dépendent les unes des autres pour le moment. Pour le moment, chaque dépendance ne doit être que dans une seule cible. Je ne sais pas pourquoi pour l'instant, mais je vais essayer d'en savoir plus et de classer le bug s'il n'est pas encore classé.

Zdeněk Topič
la source
Salut, une chance d'en savoir plus?
2019
Avez-vous découvert quelque chose à ce sujet?
bogen
Rien jusqu'à présent :) Le problème est vraiment, qu'il relie les dépendances statiquement dans les cibles.
Zdeněk Topič
0

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.swiftpour avoir RxTestune bibliothèque dynamique, cela devrait plutôt fonctionner. Vous pouvez facilement tester cela en clonant RxSwiftet en modifiant cette ligne:

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

dans:

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

puis en faisant glisser la copie locale de RxSwiftdans 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 RxSwiftcommunauté de changer ses produits en versions dynamiques ou de vendre des versions dynamiques en plus des versions par défaut.

3) N'utilisez pas RxTestou 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.

bscothern
la source
Cloner et modifier chaque dépendance ne me semble pas être une solution. La plupart des packages utilisent le type par défaut, qui est quelque peu automatique je crois et choisit la liaison statique à chaque fois pour une raison quelconque. Je m'attendrais à ce que puisque le package est lié à plusieurs cibles, il choisirait de le lier dynamiquement.
Zdeněk Topič
Oui c'est une douleur. Je suis d'accord que la dynamique serait le comportement attendu ici. Le mieux que nous puissions faire pour changer cela est de déposer une demande de commentaires auprès d'Apple.
bscothern