iOS Xcode SPM gagal melakukan demangle superclass

9

Aplikasi saya terdiri dari banyak proyek (kerangka kerja), satu untuk setiap fitur utama dan kerangka kerja umum dengan segala macam hal yang perlu saya akses di banyak fitur saya.

Saya menggunakan Manajer Paket Swift Xcode 11 untuk menambahkan dependensi.

Kerangka umum berisi ketergantungan RxSwift, yang saya gunakan di seluruh proyek.

Saya menghadapi masalah ketika saya mencoba menggunakan RxTest di salah satu kerangka kerja fitur saya.

Jika saya menambahkan RxTest via SPM ke target tes secara langsung dan menjalankan tes, saya dapatkan

gagal membuat superclass 'nama kelas' dari nama yang rusak 'nama kelas lain'

dan banyak

'Nama kelas' kelas diimplementasikan di 'jalur kerangka kerja umum' dan 'jalur target pengujian'

di mana semua kelas ini terkait Rx. Kesalahan 'gagal untuk demangle' membuat crash tes dan hanya terjadi ketika saya mencoba menginisialisasi kelas RxTest.

Jika saya menambahkan RxTest ke kerangka umum, tes berjalan dengan baik, tetapi ketika saya menjalankan aplikasi, saya mengerti

dyld: Library tidak dimuat: @ rpath / XCTest.framework / XCTest

Yang masuk akal, karena saya menambahkan kerangka uji ke kerangka non-tes, dan itu bukan sesuatu yang baik untuk dilakukan.

Jadi pada dasarnya, saya tidak bisa mendapatkan konfigurasi tempat tes dan aplikasi berjalan dengan baik. Baik aplikasi berjalan atau tes berjalan.

Bagaimana saya bisa membuatnya bekerja? Apakah ada cara untuk memasukkan RxTest pada kerangka kerja umum hanya ketika saya membangunnya pada target uji? Atau haruskah RxTest hanya disertakan pada target pengujian dan saya kehilangan beberapa konfigurasi?

dtmokada
sumber

Jawaban:

2

Xcode dengan dependensi SPM tidak dapat menangani dependensi SPM yang sama di beberapa target yang saling bergantung saat ini. Setiap ketergantungan harus hanya dalam satu target saat ini. Saya tidak tahu mengapa sampai sekarang, tetapi saya akan mencoba menyelidiki lebih lanjut dan mengajukan bug jika belum diajukan.

Zdeněk Topič
sumber
Hai, ada keberuntungan mencari tahu lebih banyak?
janh
Menemukan sesuatu tentang ini?
bogen
Sejauh ini tidak ada :) Masalahnya adalah, itu menghubungkan dependensi secara statis dalam target.
Zdeněk Topič
0

Masalah Anda kemungkinan bahwa perpustakaan menggunakan tautan statis dan bukannya tautan dinamis. Di SwiftPM Anda dapat menentukan perpustakaan sebagai statis atau dinamis jika Anda inginkan atau Anda dapat membiarkan sistem build memutuskan apa yang dilakukan sebagian besar paket. Xcode tampaknya lebih menyukai pendekatan statis ketika dibangun dengan SwiftPM yang menghasilkan masalah build yang Anda alami.

Jika Anda memodifikasi Package.swiftuntuk RxTestmenjadi pustaka dinamis, itu seharusnya berfungsi. Anda dapat dengan mudah menguji ini dengan mengkloning RxSwiftdan memodifikasi baris ini:

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

ke:

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

dan kemudian menyeret salinan lokal RxSwiftke dalam Xcode Project Navigator Anda. Kemudian akan menggunakan salinan lokal paket Anda daripada yang diklon oleh Xcode.

Setelah Anda melakukan ini, Anda dapat menautkannya dengan target yang Anda butuhkan dan itu akan berfungsi. Jika itu benar-benar memperbaiki masalah maka kemungkinan solusi jangka panjang Anda:

1) Memiliki garpu yang hanya mengubahnya ke perpustakaan dinamis.

2) Meyakinkan RxSwiftkomunitas untuk mengubah produk mereka ke versi dinamis atau ke versi dinamis selain default.

3) Jangan gunakan RxTestatau hal serupa di banyak tempat.


Perlu juga dicatat, bahwa Xcode 11.3 dan sebelumnya tidak mendukung pengarsipan dengan Paket Swift dinamis. Jadi, jika Anda turun rute dinamis Anda harus menunggu Xcode 11.4.

bscothern
sumber
Mengkloning dan memodifikasi setiap ketergantungan sepertinya bukan solusi bagi saya. Sebagian besar paket menggunakan tipe default, yang agak otomatis saya percaya dan memilih tautan statis setiap waktu karena alasan tertentu. Saya berharap bahwa karena paket tersebut ditautkan dalam beberapa target, ia akan memilih untuk menautkannya secara dinamis.
Zdeněk Topič
Ya itu menyebalkan. Saya setuju bahwa dinamika akan menjadi perilaku yang diharapkan di sini. Yang terbaik yang bisa kita lakukan untuk mengubahnya yaitu mengajukan permintaan umpan balik dengan Apple.
bscothern