iOS Xcode SPM ล้มเหลวในการยกเลิกการแยกซูเปอร์คลาส


9

แอพของฉันประกอบด้วยหลายโครงการ (เฟรมเวิร์ก) หนึ่งอันสำหรับแต่ละฟีเจอร์หลักและเฟรมเวิร์กทั่วไปที่มีทุกสิ่งที่ฉันจำเป็นต้องเข้าถึงในฟีเจอร์หลายอย่างของฉัน

ฉันใช้ Swift Package Manager ของ Xcode 11 เพื่อเพิ่มการอ้างอิง

กรอบงานทั่วไปประกอบด้วยการพึ่งพา RxSwift ซึ่งฉันใช้ตลอดทั้งโครงการ

ฉันประสบปัญหาเมื่อฉันพยายามใช้ RxTest ในเฟรมเวิร์กคุณลักษณะใด ๆ ของฉัน

ถ้าฉันเพิ่ม RxTest ผ่าน SPM ไปยังเป้าหมายการทดสอบโดยตรงและรันการทดสอบฉันจะได้รับ

ล้มเหลวในการแยกสถานะ superclass ของ 'ชื่อคลาส' จากชื่อ mangled 'ชื่อคลาสอื่น'

และอีกมากมาย

คลาส 'ชื่อคลาส' ถูกนำไปใช้ในทั้ง 'กรอบเส้นทางทั่วไป' และ 'เส้นทางทดสอบเป้าหมาย'

ที่คลาสเหล่านี้ทั้งหมดเกี่ยวข้อง Rx ข้อผิดพลาด 'ล้มเหลวในการปลดล็อก' เกิดข้อผิดพลาดในการทดสอบและจะเกิดขึ้นเมื่อฉันพยายามเริ่มต้นคลาส RxTest เท่านั้น

ถ้าฉันเพิ่ม RxTest ให้กับเฟรมเวิร์กทั่วไปการทดสอบจะทำงานได้ดี แต่เมื่อฉันรันแอพฉันจะได้รับ

dyld: ไลบรารีไม่ถูกโหลด: @ rpath / XCTest.framework / XCTest

ซึ่งเหมาะสมแล้วเนื่องจากฉันเพิ่มกรอบการทดสอบลงในกรอบการทดสอบที่ไม่ใช่และไม่ใช่สิ่งที่ดีที่จะทำ

โดยพื้นฐานแล้วฉันไม่สามารถรับการกำหนดค่าที่ทั้งการทดสอบและแอปทำงานได้ดี แอพพลิเคชั่นทำงานหรือการทดสอบรัน

ฉันจะทำงานนี้ได้อย่างไร มีวิธีใดที่จะรวม RxTest ไว้ในเฟรมเวิร์กทั่วไปเฉพาะเมื่อฉันสร้างมันบนเป้าหมายการทดสอบหรือไม่? หรือ RxTest ควรรวมอยู่ในเป้าหมายการทดสอบเท่านั้นและฉันขาดการตั้งค่าบางอย่าง?

คำตอบ:


2

Xcode ที่มีการอ้างอิง SPM ไม่สามารถจัดการการพึ่งพา SPM เดียวกันในหลาย ๆ เป้าหมายที่ขึ้นอยู่กับแต่ละอื่น ๆ ในขณะนี้ การพึ่งพาแต่ละครั้งจะต้องอยู่ในเป้าหมายเดียวเท่านั้นในขณะนี้ ฉันไม่รู้ว่าทำไม ณ ตอนนี้ แต่ฉันจะลองตรวจสอบเพิ่มเติมและแก้ไขข้อผิดพลาดหากยังไม่ได้ยื่น


สวัสดีโชคดีไหมที่หาข้อมูลเพิ่มเติม?
janh

พบสิ่งที่เกี่ยวกับเรื่องนี้?
bogen

จนถึงตอนนี้ :) ปัญหาคือว่ามันเชื่อมโยงการพึ่งพาแบบคงที่ในเป้าหมาย
ZdeněkTopič

0

ปัญหาของคุณอาจเป็นไปได้ว่าไลบรารีกำลังใช้การเชื่อมโยงแบบคงที่แทนการเชื่อมโยงแบบไดนามิก ใน SwiftPM คุณสามารถระบุไลบรารีว่าเป็นแบบสแตติกหรือแบบไดนามิกหากคุณต้องการหรือคุณสามารถปล่อยให้ระบบการสร้างตัดสินใจว่าแพ็คเกจใดที่ทำอยู่ Xcode ดูเหมือนว่าจะชอบแนวทางคงที่เมื่อสร้างด้วย SwiftPM ซึ่งส่งผลให้ปัญหาการสร้างที่คุณกำลังประสบอยู่

หากคุณปรับเปลี่ยนPackage.swiftให้RxTestเป็นห้องสมุดแบบไดนามิกแทนมันควรจะทำงาน คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดายโดยการโคลนRxSwiftและแก้ไขบรรทัดนี้:

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

เป็น:

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

จากนั้นลากสำเนาโลคัลRxSwiftลงใน Xcode Project Navigator ของคุณ มันจะใช้สำเนาโลคัลแพ็กเกจของคุณแทนชุดที่คัดลอกโดย Xcode

เมื่อคุณทำเช่นนี้คุณสามารถเชื่อมโยงมันกับเป้าหมายใด ๆ ที่คุณต้องการและมันควรจะทำงาน หากวิธีนี้แก้ไขปัญหาได้จริงแสดงว่าโซลูชันระยะยาวของคุณน่าจะเป็น:

1) มีทางแยกที่เปลี่ยนเป็นไลบรารีแบบไดนามิก

2) โน้มน้าวให้RxSwiftชุมชนเปลี่ยนผลิตภัณฑ์เป็นไดนามิกหรือซื้อเวอร์ชั่นไดนามิกนอกเหนือจากค่าเริ่มต้น

3) อย่าใช้RxTestหรือสิ่งที่คล้ายกันในหลาย ๆ ที่


เป็นที่น่าสังเกตว่า Xcode 11.3 และก่อนหน้านี้ไม่สนับสนุนการเก็บถาวรด้วย Swift Packages แบบไดนามิก ดังนั้นหากคุณลงเส้นทางแบบไดนามิกคุณจะต้องรอ Xcode 11.4


การโคลนและการดัดแปลงการพึ่งพาแต่ละครั้งดูเหมือนจะไม่ใช่วิธีแก้ปัญหาสำหรับฉัน แพ็คเกจส่วนใหญ่ใช้ประเภทเริ่มต้นซึ่งค่อนข้างอัตโนมัติฉันเชื่อและเลือกการเชื่อมโยงแบบคงที่ทุกครั้งด้วยเหตุผลบางอย่าง ฉันคาดหวังว่าเนื่องจากแพ็คเกจนั้นเชื่อมโยงในหลายเป้าหมายจึงควรเลือกลิงก์แบบไดนามิก
ZdeněkTopič

ใช่มันเป็นความเจ็บปวด ฉันยอมรับว่าไดนามิกจะเป็นพฤติกรรมที่คาดหวังที่นี่ วิธีที่ดีที่สุดที่เราสามารถทำได้เพื่อเปลี่ยนแปลงนั่นคือไฟล์คำขอความคิดเห็นกับ Apple
bscothern
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.