كيفية إضافة إطار عمل سويفت ديناميكي إلى أداة سطر الأوامر

دعونا نتعرف على كيفية محاولة إضافة إطار عمل ديناميكي إلى أداة سطر الأوامر الخاصة بي ومناقشة الخطأ الذي حدث في كل خطوة على الطريق.

الخطوة 1: قم بإضافته إلى قسم "الأطر المرتبطة والمكتبات"

هذا هو ما يحدث عند تشغيل التطبيق الخاص بك:

dyld: لم يتم تحميل المكتبة: @ rpath / libswiftAppKit.dylib
تمت الإشارة إليه من: / المستخدمون / اللغة الإنجليزية / المكتبة / المطور / الرمز / البيانات المعينة / الاختبار / اختبار Tool-fnrmhjvjmugvqueaqvbkklzwhqvuv/Build/Products/Debug/ThirdParty.framework/Versions/A/ThirdParty
السبب: لم يتم العثور على الصورة

يحاول ThirdParty.framework العثور على libswiftAppKit.dylib (والذي يعد جزءًا من مكتبات Swift القياسية) في الدليل @ rpath.

يمكننا أن نرى كيف يعرّف ThirdParty.framework @ rpath بالجري

$ oTool -l ThirdParty.framework / Versions / Current / ThirdParty
قيادة التحميل 27
كمد LC_RPATH
cmdsize 48
pathexecutable_path /../ Frameworks (إزاحة 12)
قيادة التحميل 28
كمد LC_RPATH
cmdsize 40
path @ loader_path / أطر (الإزاحة 12)

حسنا تبادل لاطلاق النار. هذه ليست ذات صلة بأداة سطر الأوامر الخاصة بنا. ليس لدينا أي مجلدات باسم / أطر عمل أو .. / إطارات. لماذا تبحث عن مكتبات Swift القياسية هناك؟

لأنه مصمم لتطبيقات iOS و Mac. إليك بنية الدليل داخل تطبيق Mac:

هذا ما يفسر المسارexecutable_path /../ الأطر

وبالنسبة لنظام iOS ، فإن بنية الدليل داخل التطبيق هي:

loader_path يساوي @ executable_path عندما يتم تحميل الإطار من الملف القابل للتنفيذ

وهذا ما يفسر path @ loader_path / Frameworks (الإزاحة 12)

ولكن ماذا عنا ، مطور أداة سطر الأوامر المتواضع؟ ترتبط مكتبات Swift القياسية بشكل ثابت داخل برنامجنا القابل للتنفيذ ، لكن أطر عمل الجهات الخارجية لا يمكنها العثور عليها. للأسف ، لا يتم تخزينها في مكان قياسي على كل جهاز Mac. يمكن للمطورين الوصول إليهم مدفونة داخل Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx (ولكن يرجى عدم مطالبة المستخدمين بتثبيت Xcode).

إذن ماذا نفعل؟ الممارسة المعتادة التي رأيتها هي إنشاء إطار مخصص لمشروعك ، واستيراد جميع التبعيات إليه ، ثم نسخ المكتبات القياسية السريعة أيضًا.

الخطوة 2: إنشاء إطار مخصص ونسخ مكتبات Swift القياسية

سيؤدي هذا إلى نسخ / لصق مكتبات Swift القياسية داخل FirstParty.framework / Versions / Current / Frameworks /تأكد من نسخ في التبعية طرف ثالث كذلكالآن الأطر الخاصة بك كلها معا!

في احسن الاحوال! الآن دعونا نمضي قدمًا ونشغل أداة سطر الأوامر الخاصة بنا ...

objc [2335]: يتم تطبيق Class _TtC8Dispatch16DispatchWorkItem في كل من /Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv/Build/SystemBar/Sibib/SystemBames.html و / المستخدمون / seanberry / Library / Developer / Xcode / DerivedData / TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv / Build / Products / Debug / TestCommandLineTool (0x1005c7698). وسوف تستخدم واحدا من اثنين. أي واحد غير معروف.
كرر الخطأ أعلاه في 20 طرق مختلفة

يشاهد تطبيقك الآن نسختين مختلفتين من مكتبات Swift القياسية: تلك المرتبطة بشكل ثابت داخل الملف القابل للتنفيذ ، وتلك الموجودة داخل المجلد / Frameworks.

هناك حلان من هنا.

الخطوة 3 (الخيار أ): قم بإنشاء تطبيق Mac بدلاً من ذلك واستخرج الملف القابل للتنفيذ

لقد بحثت عن أدوات سطر الأوامر الشهيرة Carthage و SwiftLint لمعرفة كيف تعاملوا مع هذه المشكلة. تبين أنها ليست معدة كأدوات لسطر الأوامر! إنها تطبيقات Mac! لماذا ا؟ لأن تطبيق Mac لا يرتبط بشكل ثابت بالمكتبات القياسية. ينشرون أنفسهم كأدوات لسطر الأوامر عن طريق إضافة مرحلة تشغيل تستخرج الملف القابل للتنفيذ من حزمة التطبيق.

#! / بن / سحق
## استخراج أداة قرطاج CLI من حزمة التطبيقات الخاصة بها. من المفترض أن يتم تشغيل
# كجزء من مرحلة بناء Xript Run Script.
cp -v "$ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_PATH}" "$ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_NAME}"

يمكنك المضي قدما وتفعل ذلك بهذه الطريقة ، لا مشكلة. لكنني وجدت طريقة أخرى للتغلب على هذه المشكلة.

الخطوة 3 (الخيار ب): تعطيل الارتباط الثابت

أضف هذه الإعدادات إلى إعدادات تعريف المستخدم الخاصة بك:

SWIFT_FORCE_DYNAMIC_LINK_STDLIB نعم
SWIFT_FORCE_STATIC_LINK_STDLIB NO

سيؤدي ذلك إلى إجبار الملف القابل للتنفيذ على ربط جميع المكتبات ديناميكيًا. تأكد من إخبار Xcode أين يمكن العثور عليها عن طريق إضافة دليل إطار العمل إلى "مسارات البحث Runpath"

@ executable_path / FirstParty.framework / إصدارات / الحالية / أطر

حظا سعيدا مع أداة سطر الأوامر الخاصة بك!

يحاول Sean الحصول على Xcode للترجمة في Livefront