iOS Xcode SPM không thể gỡ lỗi siêu lớp


9

Ứng dụng của tôi bao gồm nhiều dự án (khung), một dự án cho mỗi tính năng chính và khung chung với tất cả các loại mà tôi cần truy cập trong nhiều tính năng của mình.

Tôi đang sử dụng Trình quản lý gói Swift của Xcode 11 để thêm phụ thuộc.

Khung chung chứa một phụ thuộc RxSwift, mà tôi sử dụng trong toàn bộ dự án.

Tôi đang gặp vấn đề khi tôi cố gắng sử dụng RxTest trong bất kỳ khung tính năng nào của mình.

Nếu tôi thêm RxTest qua SPM trực tiếp vào mục tiêu thử nghiệm và chạy thử nghiệm, tôi sẽ nhận được

thất bại trong việc giải mã siêu lớp của 'tên lớp' từ tên bị xáo trộn 'tên lớp khác'

và nhiều

Lớp 'tên lớp' được triển khai trong cả 'đường dẫn khung chung' và 'đường dẫn đích thử nghiệm'

trong đó tất cả các lớp này có liên quan đến Rx. Lỗi 'không thể gỡ lỗi' làm hỏng bài kiểm tra và chỉ xảy ra khi tôi cố gắng khởi tạo một lớp RxTest.

Nếu tôi thêm RxTest vào khung chung, các bài kiểm tra sẽ chạy tốt, nhưng khi tôi chạy ứng dụng, tôi nhận được

dyld: Thư viện không được tải: @ rpath / XCTest.framework / XCTest

Điều này có ý nghĩa, bởi vì tôi đang thêm khung kiểm tra vào khung không kiểm tra và đó không phải là điều tốt để làm.

Về cơ bản, tôi không thể có được một cấu hình trong đó cả thử nghiệm và ứng dụng đều chạy tốt. Ứng dụng chạy hoặc thử nghiệm chạy.

Làm thế nào tôi có thể làm việc này? Có cách nào để đưa RxTest vào khung chung chỉ khi tôi xây dựng nó trên mục tiêu thử nghiệm không? Hoặc chỉ nên đưa RxTest vào các mục tiêu thử nghiệm và tôi đang thiếu một số cấu hình?

Câu trả lời:


2

Xcode với các phụ thuộc SPM không thể xử lý cùng một phụ thuộc SPM trong nhiều mục tiêu phụ thuộc lẫn nhau ngay bây giờ. Mỗi phụ thuộc chỉ cần ở một mục tiêu duy nhất tại thời điểm này. Tôi không biết tại sao cho đến bây giờ, nhưng tôi sẽ thử điều tra thêm và báo lỗi nếu nó chưa được nộp.


Xin chào, bất kỳ may mắn tìm hiểu thêm?
janh

Tìm thấy bất cứ điều gì về điều này?
sinh

Không có gì cho đến nay :) Vấn đề thực sự là, nó liên kết các phụ thuộc tĩnh trong các mục tiêu.
Zdeněk Topič

0

Vấn đề của bạn có khả năng là thư viện đang sử dụng liên kết tĩnh thay vì liên kết động. Trong SwiftPM, bạn có thể chỉ định một thư viện là tĩnh hoặc động nếu bạn muốn hoặc bạn chỉ có thể để hệ thống xây dựng quyết định đó là những gì hầu hết các gói làm. Xcode dường như thiên về cách tiếp cận tĩnh khi nó được xây dựng với SwiftPM, điều này dẫn đến các vấn đề về bản dựng mà bạn đang gặp phải.

Nếu bạn sửa đổi Package.swiftđể có RxTestmột thư viện động thay vì nó sẽ hoạt động. Bạn có thể dễ dàng kiểm tra điều này bằng cách nhân bản RxSwiftvà sửa đổi dòng này:

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

vào:

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

và sau đó kéo bản sao cục bộ RxSwiftvào Bộ điều hướng dự án Xcode của bạn. Sau đó, nó sẽ sử dụng bản sao gói địa phương của bạn thay vì bản sao được nhân bản bởi Xcode.

Khi bạn làm điều này, bạn có thể liên kết nó với bất kỳ mục tiêu nào bạn cần và nó sẽ hoạt động. Nếu điều đó thực sự khắc phục được vấn đề thì các giải pháp dài hạn của bạn có khả năng:

1) Có một ngã ba chỉ đơn giản là thay đổi nó thành một thư viện động.

2) Thuyết phục RxSwiftcộng đồng thay đổi sản phẩm của họ thành phiên bản động hoặc trả lại phiên bản động ngoài mặc định.

3) Không sử dụng RxTesthoặc những thứ tương tự ở nhiều nơi.


Điều đáng chú ý là Xcode 11.3 trở về trước không hỗ trợ lưu trữ với Gói Swift động. Vì vậy, nếu bạn đi xuống tuyến đường động, bạn sẽ phải chờ Xcode 11.4.


Nhân bản và sửa đổi từng phụ thuộc dường như không phải là một giải pháp cho tôi tho. Hầu hết các gói đang sử dụng loại mặc định, tôi tin là hơi tự động và chọn liên kết tĩnh mỗi lần vì một số lý do. Tôi hy vọng rằng gói được liên kết trong nhiều mục tiêu, nên nó sẽ chọn liên kết động.
Zdeněk Topič

Ya nó là một nỗi đau. Tôi đồng ý rằng năng động sẽ là hành vi dự kiến ​​ở đây. Điều tốt nhất chúng ta có thể làm để thay đổi đó là gửi yêu cầu phản hồi với Apple.
bscothern
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.