سؤال

نريد تخزين أهداف البناء التي تم تجاوزها في ملف خارجي وتضمين ملف الأهداف هذا في TFSBuild.proj.لدينا مجموعة خطوات أساسية تحدث ونرغب في الحصول على هذه الخطوات الإضافية ببساطة عن طريق إضافة سطر الاستيراد إلى TFSBuild.proj الذي أنشأه المعالج.

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>

لا يمكننا استيراد أي ملف في ملف $(SolutionRoot) لأنه في وقت التحقق من صحة عبارة الاستيراد، لم يتم جلب المصدر من المستودع.يبدو أن TFS يقوم بسحب ملف TFSBuild.proj أولا دون أي ملفات أخرى.

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

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

هل هناك طريقة إما:

  1. أخبر Team Build أن يقوم بسحب بعض الملفات الإضافية حتى يتم حذف تلك الملفات Import تصريحات تقييم بشكل صحيح؟
  2. تجاوز أهداف بناء الفريق مثل AfterCompile بطريقة إلى جانب Import?
  3. هل تريد في النهاية تشغيل أهداف البناء في Team Build والتي يتم الاحتفاظ بها تحت المصدر الذي تحاول بناءه؟
هل كانت مفيدة؟

المحلول

يحتوي Team Build على مرحلة "bootstrap" حيث يتم تنزيل كل شيء في مجلد Team Build Configuration (المجلد الذي يحتوي على TFSBuild.proj) من التحكم في الإصدار.يتم تنفيذ ذلك بواسطة وكيل الإنشاء قبل أن يقوم وكيل الإنشاء باستدعاء MSBuild.exe لإخباره بتشغيل TFSBuild.proj.

إذا قمت بنقل ملف الأهداف الخاص بك من ضمن SolutionRoot ووضعه في مجلد التكوين الخاص بك إلى جانب ملف TFSBuild.proj، فستتمكن بعد ذلك من استيراده إلى ملف TFSBuild.proj باستخدام بيان استيراد نسبي، على سبيل المثال.

<Import Project="myTeamBuild.targets"/>

إذا كانت هذه الأهداف تعتمد على أي تجميعات مهام MSBuild مخصصة إضافية، فيمكنك أيضًا وضعها في نفس المجلد مثل ملف TFSBuild.proj الخاص بك ويمكنك الرجوع إليها بسهولة باستخدام مسار نسبي.

لاحظ أنه في TFS2008، يكون مجلد تكوين البناء افتراضيًا ضمن $/TeamProject/TeamBuildTypes، ومع ذلك، ليس من الضروري أن يكون هناك.يمكن أن يكون موجودًا بالفعل في مجلد موجود داخل الحل الخاص بك - ويمكن أن يكون أيضًا مشروعًا في الحل الخاص بك مخصصًا لـ Team Build.وهذا له العديد من المزايا بما في ذلك تسهيل تفرع البناء.لذلك عادةً ما يكون البناء الخاص بي موجودًا في مجلد مثل هذا:

$/TeamProject/main/MySolution/TeamBuild

لاحظ أيضًا أنه بشكل افتراضي، أثناء مرحلة التمهيد للإنشاء، سيقوم وكيل الإنشاء بتنزيل الملفات الموجودة في مجلد تكوين الإنشاء فقط ولن يتكرر في أي مجلدات فرعية.إذا كنت تريد تضمين الملفات في المجلدات الفرعية أثناء مرحلة التشغيل، فيمكنك تعيين الخاصية التالية في إعدادات التطبيق لملف tfsbuildserver.exe.config على أجهزة وكيل الإنشاء (الموجودة في %ProgramFiles%\Visual Studio 9.0\Common7\IDE \PrivateAssemblies)

<add key="ConfigurationFolderRecursionType" value="Full" />

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

حظ سعيد،

مارتن.

نصائح أخرى

إذا كان يجب تشغيل الأهداف فقط عندما يقوم TFS بتشغيل البناء وليس على أجهزة التطوير المحلية الخاصة بك، فيمكنك وضع ملف الأهداف الخاص بك في المجلد الخاص بالبناء نفسه والإشارة إليه باستخدام:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />

ومع ذلك، إذا كنت تريد تشغيل الأهداف لجميع الإصدارات، فيمكنك إعدادها بحيث تشير إليها المشاريع الفردية عن طريق إضافة شيء مثل:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />

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

إذا قمت بإنشاء ملف هدف تجاوزات لاستيراده وأطلقت عليه اسمًا مثل TeamBuildOverrides.targets ووضعته في نفس المجلد في التحكم بالمصدر حيث يوجد TFSBuild.proj لنوع البناء الخاص بك، فسيتم سحبه أولاً وسيكون متاحًا للاستيراد إلى TFSBuild ملف .proj.افتراضيًا، تتم إضافة ملف TFSBuild.proj إلى المجلد TeamBuildTypes في التحكم بالمصادر مباشرة ضمن المجلد الجذر لمشروعك.

استخدم عبارة الاستيراد التالية في ملف TFSBuild.proj الخاص بك:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />

تأكد من عدم وجود أي تجاوزات مكررة في ملف TFSBuild.proj وإلا فلن يتم إطلاق التجاوزات المستوردة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top