Meu aplicativo é composto de muitos projetos (estruturas), um para cada recurso principal e um quadro comum com todos os tipos de coisas que eu preciso acessar em vários dos meus recursos.
Estou usando o Swift Package Manager do Xcode 11 para adicionar dependências.
A estrutura comum contém uma dependência do RxSwift, que eu uso durante todo o projeto.
Estou enfrentando problemas quando tento usar o RxTest em qualquer uma das minhas estruturas de recursos.
Se eu adicionar o RxTest via SPM diretamente ao destino do teste e executar os testes, recebo
falha ao desmontar a superclasse de 'nome da classe' do nome mutilado 'outro nome da classe'
e muitos
A classe 'nome da classe' é implementada tanto no 'caminho da estrutura comum' quanto no 'caminho de destino do teste'
onde todas essas classes estão relacionadas à Rx. O erro 'falha ao desmembrar' falha no teste e só ocorre quando tento inicializar uma classe RxTest.
Se eu adicionar o RxTest à estrutura comum, os testes executam bem, mas quando executo o aplicativo, recebo
dyld: Biblioteca não carregada: @ rpath / XCTest.framework / XCTest
O que faz sentido, porque estou adicionando uma estrutura de teste a uma estrutura que não é de teste e não é algo bom de se fazer.
Então, basicamente, não consegui obter uma configuração em que os testes e o aplicativo funcionem bem. O aplicativo é executado ou os testes são executados.
Como posso fazer isso funcionar? Existe uma maneira de incluir o RxTest na estrutura comum somente quando eu o construo em um destino de teste? Ou o RxTest deve ser incluído apenas nos destinos de teste e estou faltando alguma configuração?
fonte
É provável que seu problema seja que a biblioteca esteja usando vinculação estática em vez de vinculação dinâmica. No SwiftPM, você pode especificar uma biblioteca como estática ou dinâmica, se desejar, ou pode deixar o sistema de compilação decidir qual é o que a maioria dos pacotes faz. O Xcode parece favorecer a abordagem estática ao compilar com o SwiftPM, o que resulta nos problemas de compilação que você está enfrentando.
Se você modificar o
Package.swift
terRxTest
ser uma biblioteca dinâmica em vez disso, deve funcionar. Você pode testar isso facilmente, clonandoRxSwift
e modificando esta linha:para dentro:
e, em seguida, arrastando a cópia local de
RxSwift
para o seu Xcode Project Navigator. Ele usará sua cópia local do pacote em vez da cópia clonada pelo Xcode.Depois de fazer isso, você pode vinculá-lo a qualquer destino que você precisa e deve funcionar. Se isso realmente resolver o problema, é provável que suas soluções de longo prazo:
1) Tenha um fork que simplesmente o altere para uma biblioteca dinâmica.
2) Convença a
RxSwift
comunidade a alterar seus produtos para versões dinâmicas ou de venda dinâmica, além do padrão.3) Não use
RxTest
coisas semelhantes em vários lugares.Também é importante notar que o Xcode 11.3 e versões anteriores não suportam arquivamento com pacotes Swift dinâmicos. Portanto, se você seguir a rota dinâmica, terá que esperar pelo Xcode 11.4.
fonte