مرحبًا ، أنا سانيا - مطور نظام التشغيل iOS وفي هذه المقالة سأشارك طريقي لحل الصداع الذي يحدث عند العمل في مشروع بأهداف متعددة.

أتوقع السؤال "لماذا تحتاج إلى عدة أهداف في المشروع ، سانيا؟" أجيب: في المشروع الذي عملت فيه سابقًا ، كان هناك هدف واحد مرتبط بحساب العميل ، بحيث:
- لم نتمكن من الوصول إلى هذا الحساب ؛
- لم يكن هناك إمكانية لإنشاء ملفات تعريف التوفير وشهادات التوزيع ؛
- أسوأ ما في الأمر هو أنه لم يكن من الممكن إضافة أجهزة جديدة إلى ملفات تعريف التوفير.
وبالتالي ، عند شراء أجهزة جديدة في الاستوديو ، كنا ننتظر سلسلة كاملة من المفاوضات مع جانب العميل لإضافتها إلى حسابك وإتاحة الفرصة لاختبارها.
كان الحل واضحًا - لإنشاء هدف ثانٍ ، سيكون مشابهاً للهدف الرئيسي ، ولكن له معرف حزمة مختلف وسيتم ربطه بالكامل وبصورة كاملة بحساب الاستوديو الخاص بنا. لم يقل قال من القيام به! سمح لنا الهدف الثاني بإجراء تطوير كامل بغض النظر عن المطورين من جانب العميل ، مما أدى إلى حفظ عملية التطوير أكثر من مرة ، على سبيل المثال ، عندما قام مطورو العميل بإزالة جميع أجهزتنا في ملف تعريف توفير الهدف الرئيسي ولم نتمكن من تشغيل التطبيق على أجهزتهم.
لا تزال هناك عدة أهداف تظهر في مشروعك عند الضرورة ، على سبيل المثال:
- جمع العديد من التطبيقات من قاعدة رمز واحدة ، ولكن مع موارد مختلفة ؛
- احتفظ بمثيلات متعددة للتطبيق على جهاز واحد.
ولكن العمل على عدة أهداف يؤدي إلى عيوبه ، الشيء الرئيسي هو الحاجة إلى التحكم الصارم في عملية إضافة ملفات جديدة إلى المشروع. كلاهما مطابق لبعضهما البعض ، على التوالي ، عند إضافة ملف جديد إلى المشروع ، من الضروري وضع علامة أمام كلا الهدفين.

هذا أمر صعب للغاية عند العمل في فريق كبير متعدد المستويات ، سواء في المهارة أو بحسن نية.
إذا لم تتبع هذه القاعدة البسيطة ، فبعد الدمج التالي ، قد تجد أن أحد الأهداف قد توقف عن التجميع ، ويقسم Xcode أنه لا يمكن العثور على فصل أو آخر. ولكن الشيء الأكثر إثارة للاهتمام هو أنه إذا لم يقم شخص ما بإضافة ملف من Copy Bundle Resources إلى كلا الهدفين (على سبيل المثال ، خلايا xib) ، يمكنك فقط العثور على هذا الخطأ في وقت التشغيل.
بعد مشكلة أخرى مع هدف Debug ، قررنا منح التحكم في تناسق أهداف البرنامج النصي. لقد اخترنا لغة Ruby كأداة ، لأنها تحتوي على جوهرة xcodeproj ممتازة ، والتي تعد تقريبًا المعيار لأدوات الكتابة لتطوير iOS (انظر fastlane ، generamba ، إلخ).
نتيجة لذلك ، قمنا بتطوير برنامج نصي يقوم بتنفيذ منطق العمل التالي:
- يتم تغذية المسار إلى ملف المشروع وأسماء الأهداف التي تم اختبارها في الإدخال ؛
- في الطريق إلى المشروع ، يجد البرنامج النصي المشروع نفسه ؛
- يختار الأهداف المطلوبة ، ويجمع الملفات منها (تجميع المصادر ، نسخ حزمة الموارد والأطر) ؛
- تبحث عن الفرق بين قوائم الملفات ؛
- نحن نرمي الملفات من القائمة البيضاء للخروج من هذا الاختلاف. على سبيل المثال ، الملفات ذات الثوابت التي تختلف وفقًا للهدف (baseUrl ، إذا قررت تنظيم المشروع بحيث تصل التطبيقات من أهداف مختلفة إلى خوادم مختلفة) ، أو ملفات GoogleService-Info.plist ، والتي ستكون مختلفة بالنسبة لأهداف مختلفة.
إذا وجد البرنامج النصي الفرق ، لدينا مشكلة. هذا يعني أنه تمت إضافة هذا الملف أو ذلك الإطار / الإطار إلى هدف واحد ، ولكن لم تتم إضافته إلى هدف آخر.
وبالتالي ، فإن البرنامج النصي يسمح لك:
- تأكد من أن جميع الملفات من Compile Sources و Copy Bundle Resources تمت إضافتها بشكل صحيح إلى كلا الهدفين ؛
- يتم أيضًا التحقق من هوية قوائم الأطر المضافة ، وهو أمر مهم للغاية إذا كان لمشروعك بنية متعددة الوحدات ؛
- سيسمح لك دمج البرنامج النصي في Build Phase بتحديد المشكلة حتى قبل مرحلة بناء المشروع ؛
- وإذا قمت في وقت سابق بجمع كلا الهدفين على CI لهذا ، يمكنك الآن ترك التجميع لواحد فقط ، مما يقلل من وقت التجميع على CI بمقدار النصف.
في حالة وجود خطأ ، في Xcode يمكنك ملاحظة الرسالة التالية:

في حالة النجاح ، ستجد حيدات:

إرشادات مفصلة للإضافة إلى المشروع ، والإعدادات ، وكذلك مثال للمشروع في المستودع .
تُظهر الأداة المساعدة الناتجة تمامًا أنه حتى كمطور iOS ، يمكنك إنشاء جزء صغير من الإبداع في عملك اليومي والقيام بالأتمتة والبرمجة التي من شأنها تبسيط حياتك!
شكرا لاهتمامكم!