iOS Xcode SPM이 수퍼 클래스를 해제하지 못했습니다.


9

내 응용 프로그램은 각 주요 기능마다 하나씩 많은 프로젝트 (프레임 워크)와 여러 기능으로 액세스 해야하는 모든 종류의 공통 프레임 워크로 구성됩니다.

Xcode 11의 Swift Package Manager를 사용하여 종속성을 추가하고 있습니다.

공통 프레임 워크에는 RxSwift 종속성이 포함되어 있으며 전체 프로젝트에서 사용합니다.

기능 프레임 워크에서 RxTest를 사용하려고 할 때 문제가 있습니다.

SPM을 통해 RxTest를 테스트 대상에 직접 추가하고 테스트를 실행하면

맹 글링 된 이름 'other class name'에서 'class name'의 수퍼 클래스를 디 매글하지 못했습니다.

그리고 많은

클래스 '클래스 이름'은 '공통 프레임 워크 경로'와 '테스트 대상 경로'모두에서 구현됩니다.

이 모든 클래스는 Rx와 관련이 있습니다. 'demund to demangle'오류는 테스트와 충돌하며 RxTest 클래스를 초기화하려고 할 때만 발생합니다.

공통 프레임 워크에 RxTest를 추가하면 테스트가 정상적으로 실행되지만 앱을 실행할 때

dyld : 라이브러리가로드되지 않았습니다 : @ rpath / XCTest.framework / XCTest

테스트 프레임 워크를 비 테스트 프레임 워크에 추가하고 있기 때문에 좋지 않습니다.

기본적으로 테스트와 앱이 모두 제대로 실행되는 구성을 얻을 수 없었습니다. 앱이 실행되거나 테스트가 실행됩니다.

이 작업을 어떻게 수행 할 수 있습니까? 테스트 대상에서 빌드 할 때만 공통 프레임 워크에 RxTest를 포함시키는 방법이 있습니까? 또는 RxTest가 테스트 대상에만 포함되어야하고 일부 구성이 누락 되었습니까?

답변:


2

SPM 종속성이있는 Xcode는 현재 서로 의존하는 여러 대상에서 동일한 SPM 종속성을 처리 할 수 ​​없습니다. 각 종속성은 현재 단일 대상에만 있어야합니다. 지금은 왜 그런지 모르겠지만 아직 제출하지 않았다면 더 조사하고 파일 버그를 조사해 보겠습니다.


안녕, 운이 더 알아?
janh

이것에 대해 알아 낸 것이 있습니까?
bogen

지금까지 아무것도 :) 문제는 실제로 대상의 종속성을 정적으로 연결한다는 것입니다.
Zdeněk Topič

0

라이브러리에서 동적 연결 대신 정적 연결을 사용하고있는 것 같습니다. 원하는 경우 SwiftPM에서 라이브러리를 정적 또는 동적으로 지정하거나 빌드 시스템에서 대부분의 패키지가 수행하는 작업을 결정할 수 있습니다. Xcode는 SwiftPM으로 빌드 할 때 정적 접근 방식을 선호하는 것 같습니다. 이로 인해 빌드 문제가 발생합니다.

당신이를 수정하면 Package.swift가지고 RxTest동적 라이브러리를 수 대신 작동합니다. RxSwift이 줄 을 복제 하고 수정하여이를 쉽게 테스트 할 수 있습니다 .

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

으로:

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

그런 다음 로컬 사본을 RxSwiftXcode 프로젝트 네비게이터로 드래그하십시오 . 그런 다음 Xcode에 의해 복제 된 패키지 대신 로컬 패키지 사본을 사용합니다.

이 작업을 수행하면 필요한 대상과 연결할 수 있으며 작동해야합니다. 이것이 실제로 문제를 해결하면 장기 해결책이 될 수 있습니다.

1) 포크를 단순히 동적 라이브러리로 변경하십시오.

2) RxSwift커뮤니티가 기본값 외에 제품을 동적으로 변경하거나 동적 버전을 판매하도록 설득하십시오 .

3) RxTest여러 곳에서 사용하지 마십시오 .


Xcode 11.3 및 이전 버전은 동적 Swift 패키지를 사용한 아카이빙을 지원하지 않습니다. 따라서 동적 경로를 내려 가면 Xcode 11.4를 기다려야합니다.


각 의존성을 복제하고 수정하는 것은 나에게 해결책처럼 보이지 않습니다. 대부분의 패키지는 기본 유형을 사용하고 있습니다.이 유형은 다소 자동이며 어떤 이유로 든 매번 정적 링크를 선택합니다. 패키지가 여러 대상으로 연결되어 있으므로 동적으로 연결하도록 선택합니다.
Zdeněk Topič

아파요. 나는 동적이 여기에서 예상되는 행동이라는 데 동의합니다. 이를 변경하기 위해 최선을 다하는 것은 Apple에 피드백 요청을하는 것입니다.
bscothern
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.