سؤال

أحاول كتابة بناء تلقائي لأحد منتجاتنا ، وقد وصلت إلى جدار لبعض مشاريع VC ++ لدينا: أحتاج إلى أن أكون قادرًا على ضبط مسار الإخراج إلى حيث سيتم نسخ التجميعات بمجردها انتهى.

إليك ملف MSBUILD مؤقتًا:

<Project DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
 <Target Name="Build">
   <VCBuild Projects="C:\src\SomeProject\SomeProject.vcproj"
            ToolPath="C:\Program Files\Microsoft Visual Studio 9.0\VC\vcpackages"
            Configuration="Debug" />
 </Target>
</Project>





إجابة stijn:

اعتقدت أنني سأستخدم هذه المساحة لتوضيح كيف استخدمت إجابة Stijn شخصيًا لحل هذا. لديه بعض التعليمات البرمجية في ملف MSBuild الخاص به الذي يكتب ملف VSPROPS له. قررت اتباع نهج أبسط وأن أكتب الملف يدويًا.

لقد قمت بإنشاء هذا الملف ، يسمى build.vsprops (مسار الإخراج الخاص بي هو الخامس :)

<?xml version="1.0"?>
<VisualStudioPropertySheet ProjectType="Visual C++"
                           Version="8.00"
                           Name="Overrides"
                           OutputDirectory="V:\">
  <Tool Name="VCCLCompilerTool"
        AdditionalUsingDirectories="V:\" />
</VisualStudioPropertySheet>

ثم قمت بتحرير ملف msbuild الخاص بي لإضافة معلمة تجاوز:

<Project DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
 <Target Name="Build">
   <VCBuild Projects="C:\src\SomeProject\SomeProject.vcproj"
            ToolPath="C:\Program Files\Microsoft Visual Studio 9.0\VC\vcpackages"
            Configuration="Debug"
            Override="$(MSBuildProjectDirectory)\build.vsprops" />
 </Target>
</Project>
هل كانت مفيدة؟

المحلول

إلقاء نظرة على المعلمة التجاوز ل مهمة VCBUILD. في الأساس ، يمكنك تحديد ورقة خاصية يمكنك استخدامها لتجاوز أي خاصية تريدها (لها نفس تأثير إضافة ورقة خاصية إلى أعلى القائمة في المشروع داخل VS). يمكنك حتى إنشاء ملف التجاوز باستخدام مهمة WriteLinestofile.

مثال:

<PropertyGroup>
  <VCOverridesFile Condition=" '$(VCOverridesFile)'=='' ">overrides.vsprops</VCOverridesFile>
  <VCOverridesOpen>%3C?xml version=%221.0%22?%3E%0D%0A%3CVisualStudioPropertySheet ProjectType=%22Visual C++%22 Version=%228.00%22 Name=%22My Overrides%22%3E</VCOverridesOpen>
  <VCOverridesClose>%3C/VisualStudioPropertySheet%3E</VCOverridesClose>
  <MyOutPath>&lt;Tool Name="VCLinkerTool" OutputFile ="c:\my.exe"/&gt;</MyOutPath>
</PropertyGroup>

<Target Name="WriteOverridesFile">
  <WriteLinesToFile
    File="$(VCOverridesFile)"
    Lines="$(VCOverridesOpen);$(AdditionalVCOverrides);$(VCOverridesClose)"
    Overwrite="true" />
</Target>

ثم تمرير $ (vCoverridesFile) إلى خاصية Override وتأكد من أن مهمة VCBuild الخاصة بك تعتمد على إعادة تشغيل strintridesfile.

نصائح أخرى

القيام بذلك بالطريقة القذرة التي يمكنك تمرير مسار الدليل من خلال وسيطات سطر الأوامر من msbuild.

msbuild yourProject /p:OutDir=yourPath

على الرغم من أنني أظن ، يجب أن تكون هناك طريقة أفضل لإنجاز المهمة. الفكرة الرئيسية هي تعيين خاصية "Outsir" بطريقة لن يتم تجاوزها بواسطة SomeProject.vcproj

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