توسيع عملية البناء باستخدام MSBuild

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

القائمة



المفاهيم الأساسية ( القائمة )


تم تصميم MSBuild بحيث يتم تقسيم تجميع المشروع إلى عدة مراحل.

الهدف هو مرحلة معينة (حدث) يحدث أثناء تجميع المشروع. يمكنك استخدام أهداف قياسية ، أو تحديد أهدافك.

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

اقتباس من وثائق الاستهداف ( https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets ):
يستهدف تجميع المهام معًا بترتيب معين والسماح بدراسة عملية البناء في وحدات أصغر.
على سبيل المثال ، قد يحذف هدف واحد جميع الملفات الموجودة في دليل الإخراج للتحضير للبناء ، بينما قد يحذف هدف آخر
يجمع مدخلات المشروع ويضعها في الدليل الفارغ.

دورة حياة بناء MSBuild ( القائمة )


بالنسبة لـ MSBuild ، قامت Microsoft بتعريف عدد من الأهداف القياسية (في ملفات Microsoft.Common.targets و Microsoft.CSharp.targets ، وما إلى ذلك). تم تحديد عدد كبير من الأهداف المختلفة ، ولكن في هذه المقالة لن نتحدث عن هذا بالتفصيل. بعض الأهداف القياسية (مرتبة):

قائمة الهدف (المفسد)
  • Beforerebuild
  • نظيف
  • قبل البناء
  • BuildOnlySettings
  • PrepareForBuild
  • PreBuildEvent
  • حل المراجع
  • تحضير الموارد
  • ResolveKeySource
  • ترجمة
  • غير مُدار
  • إنشاء مجموعات تسلسلية
  • CreateSatelliteAssemblies
  • إنشاء قوائم الإعلانات
  • GetTargetPath
  • التحضير للتشغيل
  • التسجيل غير المُدار
  • التنظيف المتزايد
  • PostBuildEvent
  • بعد بناء
  • بعد البناء


تم تصميم هدفي BeforeBuild و AfterBuild خصيصًا ليتم تجاوزهما ويمكن استخدامهما. لا أوصي باستخدام الأهداف المتبقية من القائمة حتى لا يكسر شيء .

للحصول على عرض أكثر تفصيلاً لقائمة الأهداف ، يمكنك استخدام الخيار / pp :. بفضل هذه المعلمة ، سيتم إنشاء ملف يتم فيه تضمين جميع عمليات الاستيراد (بما في ذلك ملفات الأهداف.). يمكنك العثور على العديد من الأهداف والمتغيرات فيه (شكرا aikixd للنصيحة ).


تهيئة البيئة للأمثلة ( القائمة )


على سبيل المثال ، تحتاج إلى:

  • بيئة تطوير Visual Studio المثبتة
  • إنشاء مشروع من نوع تطبيق وحدة التحكم المسمى MSBuildExample
  • افتح مجلد المشروع وابحث عن ملف MSBuildExample.csproj هناك
  • افتح ملف MSBuildExample.csproj في المفكرة أو محرر آخر

في جميع الأمثلة في هذه المقالة ، ستحتاج إلى تحرير ملف MSBuildExample.csproj. يتضمن كل مثال إزالة الرمز من المثال السابق وإضافة مثال جديد. يجب إضافة الرمز في نهاية ملف .csproj إلى السطر الأخير الذي يحتوي على علامة إغلاق المشروع.

الصورة

إنتباه! المهم في ملف. csproj .
لتشغيل المثال ، يجب تشغيل البناء في بيئة تطوير Visual Studio. لبعض الأمثلة ، ستحتاج إلى اختيار تكوين الحل.

الصورة

سيتم عرض النتيجة في نافذة الإخراج في Visual Studio (أسفل). إذا لم يكن كذلك ، فافتحه من خلال عناصر القائمة View => Output.

الصورة


الاستهداف في MSBuild ( القائمة )


على سبيل المثال ، سنستخدم مهمة الرسالة ، والتي ستعرض المعلومات في نافذة الإخراج في Visual Studio. كما ذكرنا سابقًا ، هناك أهداف قياسية قبل BeforeBuild و AfterBuild ، سنستخدمها. للتدريب ، اقرأ القسم تحضير البيئة للأمثلة .

مثال للاستخدام المستهدف (المفسد)
كود المثال:

<Target Name="AfterBuild"> <Message Text="AfterBuild event" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target> 

نتيجة التنفيذ (غير ضرورية):
...
حدث قبل البناء
...
حدث ما بعد البناء
...


كما ترى ، تم تنفيذ رسالة المهمة ، والتي عرضت النص الذي حددناه في وقت BeforeBuild و AfterBuild في نافذة الإخراج في Visual Studio.
عند تحديد هدف بنفس الاسم ، يتم استبداله!

مثال على إعادة كتابة الهدف (المفسد)
كود المثال:

 <Target Name="BeforeBuild"> <Message Text="First message" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="Second message" Importance="high"></Message> </Target> 

نتيجة التنفيذ (غير ضرورية):
...
الرسالة الثانية
...


تم عرض الرسالة الثانية فقط ، لأنهم استخدموا أهدافًا بنفس الاسم وتم استبدالها بالقيمة الثانية.

إنشاء هدف MSBuild الخاص بك ( القائمة )


إذا لم يكن الهدفان BeforeBuild و AfterBuild كافيين أو كنت تريد تنفيذ المهام في مرحلة أخرى من دورة حياة التجميع ، يمكنك تحديد الهدف الخاص بك. لهذه الأغراض ، هناك معلمات BeforeTargets و AfterTargets.

مثال على تحديد أهدافك الخاصة (المفسد)
كود المثال:

  <Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target> <Target Name="MyCustomBeforeTarget" BeforeTargets="BeforeBuild"> <Message Text="MyCustomBeforeTarget event" Importance="high"></Message> </Target> <Target Name="MyCustomAfterTarget" AfterTargets="BeforeBuild"> <Message Text="MyCustomAfterTarget event" Importance="high"></Message> </Target> 

نتيجة التنفيذ (غير ضرورية):
...
حدث MyCustomBeforeTarget
حدث قبل البناء
حدث MyCustomAfterTarget
...


تم تحديد هدفين مخصصين - MyCustomBeforeTarget و MyCustomAfterTarget.
يتم تنفيذ هدف MyCustomBeforeTarget قبل هدف BeforeBuild لأننا حددنا:

 BeforeTargets="BeforeBuild" 

يتم تنفيذ هدف MyCustomAfterTarget بعد هدف BeforeBuild لأننا حددنا:

 AfterTargets="BeforeBuild" 

المهام في MSBuild ( القائمة )


لا تناقش هذه المقالة كيف يمكنك كتابة المهام الخاصة بك ، ولكن قبل كتابة المهام ، تحقق من قائمة المهام التي تقدمها Microsoft .

دعونا نلقي نظرة على بعض الأمثلة لاستخدام المهام ووحدات الماكرو.

معلمة الشرط (المفسد)
معلمة الحالة موجودة في جميع المهام. اقتباس من docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task-reference :
تعبير منطقي يستخدمه محرك MSBuild لتحديد ما إذا كان سيتم تنفيذ هذه المهمة.
كود المثال:

 <Target Name="BeforeBuild"> <Message Text="Current configuration is Debug" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="Current configuration is Release" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target> 

إذا تم تحديد حل تكوين Debug ، فستبدو النتيجة كما يلي (غير ضرورية):
...
التكوين الحالي هو Debug
...
إذا تم تحديد إصدار تكوين الحل ، فستبدو النتيجة كما يلي (غير ضرورية):
...
التكوين الحالي هو الإصدار
...
يمكنك العثور على معلومات حول الماكرو $ (التكوين) ووحدات الماكرو الأخرى في قسم المتغيرات ووحدات الماكرو في .csproj .

يمكن العثور على معلومات حول بنية الشروط هناك https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions

تعريف متغير في csproj (المفسد)
في المثال أعلاه ، لدينا نص يمكن توحيده. لتجنب التكرار ، سنضع نص الرسالة في متغير منفصل.

كود المثال:

 <PropertyGroup> <MessageText>Current configuration is $(Configuration)</MessageText> </PropertyGroup> <Target Name="BeforeBuild"> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target> 

لتحديد المتغير الخاص بك ، استخدم عنصر PropertyGroup .


التحقق من وجود ملف واصدار خطأ (spoiler)
في هذا المثال ، نقوم بعمل مهمة تتحقق من إنشاء ملف App.Debug.config. إذا لم يتم إنشاؤه ، فإننا نلقي خطأ. في حالة حدوث خطأ ، سيتم إيقاف الإنشاء وسيتم عرض الخطأ كأخطاء في الترجمة في نافذة قائمة الأخطاء.
نستخدم مهمة Error ومعلمة الشرط المألوفة لنا بالفعل.

كود المثال:

 <Target Name="BeforeBuild"> <Error Condition="!Exists('App.Debug.config')" Text="File App.Debug.config not found"></Error> </Target> 

النتيجة:
الصورة

تستخدم عبارة Exists المسار النسبي من المجلد الذي يوجد فيه ملف csproj. للوصول إلى المجلد الموجود أعلى المجلد الحالي ، استخدم "../". إذا كنت بحاجة إلى الوصول إلى المجلد الفرعي ، فاستخدم التنسيق "[DirectoryName] /App.Debug.config".

نسخ الملفات (spoiler)
في هذا المثال ، سنستخدم مهمة النسخ . باستخدام المهمة ، انسخ ملف App.config إلى مجلد bin / [Configuration] / Config في ملفي App.config و App.test.config.

كود المثال:

 <Target Name="BeforeBuild"> <Copy SourceFiles="App.config;App.config" DestinationFiles="$(OutputPath)/Test/App.config;$(OutputPath)/Test/App.test.config"></Copy> </Target> 

خاصية SourceFiles هي مجموعة من الملفات التي يمكن تنزيلها. تشير دون علامات اقتباس مفصولة بفواصل منقوطة.

خاصية DestinationFiles هي مجموعة من الملفات حيث سيتم نسخ الملفات. تشير دون علامات اقتباس مفصولة بفواصل منقوطة.

اقرأ المزيد حول الماكرو $ (OutputPath) في قسم المتغيرات ووحدات الماكرو في .csproj .

المتغيرات ووحدات الماكرو في .csproj ( القائمة )


يمكن استخدام عدد من وحدات الماكرو القياسية في ملف .csproj ، ويمكن العثور على قائمة بها هنا https://msdn.microsoft.com/en-us/library/c02as0cs.aspx وهنا https://msdn.microsoft.com/en-us/ مكتبة / bb629394.aspx . خذ بعين الاعتبار بعض وحدات الماكرو المفيدة:

  • $ (MSBuildToolsPath) - يشير إلى المسار إلى مجلد MSBuild. على سبيل المثال ، C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin. عند دمج مسار ، استخدم هذا الماكرو بخط مائل. على سبيل المثال ، $ (MSBuildToolsPath) \ Microsoft.Web.Publishing.Tasks.dll. وإلا ، فقد يشكل المسار بشكل غير صحيح ويعطي خطأ أنه لم يتم العثور على الملف.
  • $ (OutputPath) - المسار النسبي لمجلد الإخراج. على سبيل المثال ، bin \ Stage. استخدم هذا الماكرو بشرطة مائلة ، على سبيل المثال ، $ (OutputPath) \ $ (TargetFileName) .config.
  • $ (TargetFileName) - اسم ملف الإخراج بالملحق. على سبيل المثال ، MSBuildExample.exe. قد يختلف امتداد وتنسيق اسم ملف الإخراج عن أنواع مختلفة من المشاريع. باستخدام هذا الماكرو ، يمكنك تحديد اسم ملف التكوين بأمان. قد يكون من المفيد لتحويلات التكوين.
  • $ (التكوين) هو اسم التكوين الحالي. على سبيل المثال ، الإصدار ، التصحيح
  • $ (IntermediateOutputPath) - المسار إلى مجلد الكائنات. على سبيل المثال ، obj \ Stage.

لتحديد المعلمات الخاصة بك ، استخدم PropertyGroup . يمكن العثور على مثال لتعريف المتغير الخاص بك في قسم المهام في MSBuild .

الروابط ( القائمة )


Source: https://habr.com/ru/post/ar414969/


All Articles