iOS Xcode SPMがスーパークラスのデマングルに失敗しました


9

私のアプリは多くのプロジェクト(フレームワーク)で構成されており、メインの機能ごとに1つと、複数の機能でアクセスする必要があるあらゆる種類の共通のフレームワークがあります。

Xcode 11のSwift Package Managerを使用して依存関係を追加しています。

共通のフレームワークにはRxSwiftの依存関係が含まれており、プロジェクト全体で使用しています。

機能フレームワークのいずれかでRxTestを使用しようとすると、問題が発生します。

SPM経由でRxTestをテストターゲットに直接追加してテストを実行すると、

「クラス名」のスーパークラスをマングル名「他のクラス名」からデマングルできませんでした

そして多くの

クラス「クラス名」は「共通フレームワークパス」と「テストターゲットパス」の両方に実装されています

これらすべてのクラスはRx関連です。「デマングルに失敗しました」エラーはテストをクラッシュさせ、RxTestクラスを初期化しようとしたときにのみ発生します。

共通フレームワークにRxTestを追加すると、テストは正常に実行されますが、アプリを実行すると、

dyld:ライブラリがロードされていません:@ rpath / XCTest.framework / XCTest

私はテストフレームワークを非テストフレームワークに追加しているので、それは理にかなっています。

したがって、基本的に、テストとアプリの両方が正常に実行される構成を取得できませんでした。アプリを実行するか、テストを実行します。

これを機能させるにはどうすればよいですか?テストターゲットでビルドする場合にのみ、RxTestを共通フレームワークに含める方法はありますか?または、RxTestはテストターゲットにのみ含める必要がありますが、構成が不足していますか?

回答:


2

SPM依存関係のあるXcodeは、現在互いに依存している複数のターゲットで同じSPM依存関係を処理できません。各依存関係は、現時点では単一のターゲットにのみ存在する必要があります。現時点では理由はわかりませんが、まだ調査されていない場合は、さらに調査してバグを報告してみます。


こんにちは、もっと知りたい運はありますか?
janh

これについて何か発見しましたか?
ボーゲン

これまでのところ何もありません:)問題は本当に依存関係をターゲットに静的にリンクすることです。
ズデニェクトピック

0

ライブラリが動的リンクではなく静的リンクを使用している可能性があります。SwiftPMでは、必要に応じてライブラリを静的または動的として指定できます。または、ほとんどのパッケージが何を行うかをビルドシステムに決定させることができます。Xcodeは、SwiftPMでビルドするときに静的なアプローチを好むようで、これにより、発生しているビルドの問題が発生します。

あなたが変更した場合Package.swift持っているRxTestダイナミックライブラリをも代わりにそれが動作するはずです。RxSwiftこの行を複製して変更することで、これを簡単にテストできます。

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

に:

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

のローカルコピーをRxSwiftXcode Project Navigatorにドラッグします。次に、Xcodeによって複製されたパッケージではなく、パッケージのローカルコピーを使用します。

これを行うと、必要なターゲットに対してリンクでき、機能するはずです。それで実際に問題が解決する場合は、長期的な解決策が考えられます。

1)ダイナミックライブラリに変更するだけのフォークを用意します。

2)RxSwiftコミュニティに、製品を動的に変更するか、デフォルトに加えて動的バージョンを販売するように説得します。

3)RxTest複数の場所で同様のものを使用しないでください。


Xcode 11.3以前は動的Swiftパッケージでのアーカイブをサポートしていないことも注目に値します。したがって、動的ルートを下りた場合、Xcode 11.4を待つ必要があります。


各依存関係の複製と変更は、私にとっては解決策のようには見えません。ほとんどのパッケージはデフォルトタイプを使用していますが、これは多少自動であると私は信じており、何らかの理由で毎回静的リンクを選択しています。パッケージは複数のターゲットでリンクされているため、動的にリンクすることを選択すると思います。
ズデニェクトピック

痛いです。ここでは動的な動作が期待される動作であることに同意します。それを変えるために私たちができる最善のことは、アップルにフィードバックリクエストを提出することです。
bscothern
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.