iOS Xcode SPM non è riuscito a districare la superclasse


9

La mia app è composta da molti progetti (framework), uno per ogni funzionalità principale e un framework comune con tutti i tipi di cose a cui devo accedere in più delle mie funzionalità.

Sto usando Swift Package Manager di Xcode 11 per aggiungere dipendenze.

Il framework comune contiene una dipendenza RxSwift, che utilizzo in tutto il progetto.

Sto riscontrando problemi quando provo ad utilizzare RxTest in uno qualsiasi dei miei framework di funzionalità.

Se aggiungo RxTest tramite SPM direttamente alla destinazione del test ed eseguo i test, ottengo

impossibile districare la superclasse di "nome classe" dal nome alterato "altro nome classe"

e molti

La classe "nome classe" è implementata sia nel "percorso quadro comune" che nel "percorso target di prova"

dove tutte queste classi sono correlate a Rx. L'errore "impossibile sminuire" arresta il test e si verifica solo quando provo a inizializzare una classe RxTest.

Se aggiungo RxTest al framework comune, i test funzionano bene, ma quando eseguo l'app, ottengo

dyld: libreria non caricata: @ rpath / XCTest.framework / XCTest

Il che ha senso, perché sto aggiungendo un framework di test a un framework non di test, e non è qualcosa di buono da fare.

Quindi, fondamentalmente, non sono riuscito a ottenere una configurazione in cui sia i test che l'app funzionino correttamente. L'app viene eseguita o i test vengono eseguiti.

Come posso farlo funzionare? C'è un modo per includere RxTest nel framework comune solo quando lo costruisco su un target di test? O RxTest dovrebbe essere incluso solo negli obiettivi del test e mi manca qualche configurazione?

Risposte:


2

Xcode con dipendenze SPM non può gestire la stessa dipendenza SPM in più destinazioni che dipendono l'una dall'altra in questo momento. Ogni dipendenza deve essere al momento solo in un singolo obiettivo. Non so perché per ora, ma proverò a indagare di più e a cercare un bug se non è stato ancora archiviato.


Ciao, qualche fortuna scoprire di più?
janh

Hai scoperto qualcosa al riguardo?
Bogen

Niente finora :) Il problema è davvero che collega staticamente le dipendenze negli obiettivi.
Zdeněk Topič,

0

È probabile che il tuo problema stia utilizzando la connessione statica anziché la connessione dinamica. In SwiftPM puoi specificare una libreria come statica o dinamica se vuoi o puoi semplicemente lasciare che il sistema di compilazione decida quale è la maggior parte dei pacchetti. Xcode sembra favorire l'approccio statico quando si crea con SwiftPM, il che si traduce in problemi di build che si verificano.

Se si modifica il Package.swiftper RxTestessere una libreria dinamica invece dovrebbe funzionare. Puoi testarlo facilmente clonando RxSwifte modificando questa riga:

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

in:

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

e quindi trascinando la copia locale RxSwiftin Xcode Project Navigator. Quindi utilizzerà la tua copia locale del pacchetto anziché quella clonata da Xcode.

Una volta fatto questo, puoi collegarlo a tutti gli obiettivi di cui hai bisogno e dovrebbe funzionare. Se ciò risolve effettivamente il problema, è probabile che le tue soluzioni a lungo termine:

1) Avere un fork che semplicemente lo cambia in una libreria dinamica.

2) Convincere la RxSwiftcomunità a cambiare i propri prodotti in versioni dinamiche o vend vendibili oltre alle impostazioni predefinite.

3) Non usare RxTesto cose simili in più posti.


Vale anche la pena notare che Xcode 11.3 e precedenti non supportano l'archiviazione con i pacchetti Swift dinamici. Quindi, se percorri il percorso dinamico, dovrai attendere Xcode 11.4.


Clonare e modificare ogni dipendenza non mi sembra comunque una soluzione. La maggior parte dei pacchetti utilizza il tipo predefinito, che credo sia in qualche modo automatico e sceglie ogni volta collegamenti statici per qualche motivo. Mi aspetto che, poiché il pacchetto è collegato in più destinazioni, sceglierebbe di collegarlo in modo dinamico.
Zdeněk Topič,

Ya è un dolore. Sono d'accordo che la dinamica sarebbe il comportamento previsto qui. Il meglio che possiamo fare per cambiare è inviare una richiesta di feedback con Apple.
bscothern,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.