سؤال

قرأت مقالة جون روبنز TFS 2010 رقم بناء وملفات التجميع: تزامن تمامًا مع MSBuild 4.0 فقط, ، وأنا أتساءل عن أفضل طريقة للذهاب إلى دمج هذا.

يحتوي التنزيل على المقالة على ملفان ، واحد هو ملف الأهداف والآخر هو ملف proj.

يحتوي ملف الأهداف على عدد من المهام لتخليص رقم بناء استنادًا إلى رقم بناء TFS (نفسه المستخدم للبناء) واكتب هذا الرقم إلى مكان ما (Call It BuildNumberFile) للاستهلاك بواسطة ملفات ProJ الأخرى.

ملف PROJ بسيط للغاية. إنه يستورد ملف الأهداف المذكور أعلاه فقط ، ثم يعلن عن هدف يحمل اسم "All" مع إعلان الافتراضات على عنصر المشروع أيضًا.

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

لدي سؤالان حول هذا:

  • ما زلت أتعلم msbuild. إذا لم يتم تحديد اسم الهدف في مكان آخر في الأهداف ، فهل يتم تنفيذ الهدف؟ كيف يمكنني التأكد من تشغيل هذا الهدف؟
  • هل من المفترض أن تعلن ملفات CSPROJ عنصرًا يتضمن الموقع الذي يوجد فيه BuildNumberFile ، على الرغم من أنه غير موجود حتى التجميع؟
  • هل تحتوي مجموعات العناصر وتضمينها على تعتمد على الأدوات أو شيء يسمح لهم بالتأكد من وجود الملف قبل أن يبني؟
  • هل المحتويات الكاملة لملف CSPROJ باستخدام هذا المفترض أن يتم لفه في هدف يعبر عن regensontargets لـ BuildNumberFile؟

شكرًا!

هل كانت مفيدة؟

المحلول

أعتقد أنني حصلت على هذا الأمر ، لكن شخصين روجا لسؤالي لذا سأجيب عليه هنا:

  • يمكنك التأكد من تشغيل الهدف من خلال التعبير عن الاعتماد عليه من هدف آخر. Microsoft.Common.Targets تكشف عن هدفين-BeforeBuild و Afterbuild-معبرة عن الغرض من التغلب على التخصيص. لقد وجدت أسهل طريقة للقيام بذلك كانت <Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" /> حيث يكون WriteSharedCsharPassEmblyFile هو الهدف الذي تم الإعلان عنه في التنزيل من الرابط في المنشور الأصلي. أيضًا ، إذا كنت جديدًا على MSBuild ، فيجب إعلان هذا الهدف قبل بناء Microsoft.csharp.targets ، لكن قالب CSPROJ الافتراضي الذي يرشدك في القيام بذلك.

  • يجب أن يكتب هدف WriteSharedCsharPassEmblyFile File بالفعل إلى موقع مركزي ، لأنه عند إنشاء حل ، يتم تنفيذ جميع الأهداف مرة واحدة فقط. يجب أن تشير جميع المشاريع إلى الملف من هذا الموقع حتى لو لم يكن موجودًا ، لأنه بحلول حدوث تجميع الوقت (أو الأهم من ذلك ، بحلول الوقت الذي يتم فيه حل المراجع) ، سيتم تشغيل الهدف السابق للبناء وسيكون الملف في مكانه.

    • في بنيتي ، لدي ملفات الإصدار هذه في مجلد أسفل مجلد جذر الفرع مباشرة. علاوة على ذلك ، نظرًا لأن الملف الذي تم إنشاؤه تم إنشاؤه ، فقد قمت بإنشاءه إلى دليل الإخراج. يبدو من الغريب بعض الشيء أن تشير إلى الأشياء من الإخراج ، لكنه يحافظ على ثابت وجود جميع المنتجات في مكان واحد بحيث يمكن تفجير دليل الإخراج كوسيلة لأداء نظيف.
  • في MSBUILD ، تشكل عناصر مدخلات في النظام (عادةً ما تكون الملفات) لذلك من الغريب التفكير فيها اعتمادًا على الأهداف. بعد تعلم بعض هذا السؤال لا معنى له. في أي حال ، الجواب هو لا.

  • يجب ألا تكون محتويات الملف بأكملها في الواقع في هدف واحد-كل ما هو مطلوب هو استيراد ملف wintellect.tfsbuildnumber.targets في بداية ملف CSPROJ الخاص بك ، وإعلان إبرام تبعية على BrinSesharedCsharPassemblyFile في النهاية.

أتمنى أن يساعدك هذا!

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