2009-08-18 6 views
16

मैं MSBuild कोड का निम्न भाग है:MSBuild परियोजना फ़ाइल के भीतर ही से विभिन्न मापदंडों के साथ दो बार एक ही MSBuild लक्ष्य आह्वान करने के लिए कैसे

<PropertyGroup> 
    <DirA>C:\DirA\</DirA> 
    <DirB>C:\DirB\</DirB> 
    </PropertyGroup> 

    <Target Name="CopyToDirA" 
      Condition="Exists('$(DirA)') AND '@(FilesToCopy)' != ''" 
      Inputs="@(FilesToCopy)" 
      Outputs="@(FilesToCopy -> '$(DirA)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirA)" /> 
    </Target> 

    <Target Name="CopyToDirB" 
      Condition="Exists('$(DirB)') AND '@(FilesToCopy)' != ''" 
      Inputs="@(FilesToCopy)" 
      Outputs="@(FilesToCopy -> '$(DirB)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirB)" /> 
    </Target> 

    <Target Name="CopyFiles" DependsOnTargets="CopyToDirA;CopyToDirB"/> 

तो लक्ष्य लागू CopyFiles प्रतियां संबंधित फाइलों $(DirA) और $(DirB) को, बशर्ते वे पहले से ही नहीं हैं और अद्यतित हैं। $(DirB) के लिए -

लेकिन लक्ष्य CopyToDirA और CopyToDirB$(DirA) करने के लिए एक प्रतियां और अन्य छोड़ कर एक लग रहे हो। क्या उन्हें पहले एक लक्ष्य में एकीकृत करना संभव है जिसे पहले $(DirA) और $(DirB) के साथ बुलाया गया था?

धन्यवाद।

उत्तर

14

आप डिर्स युक्त एक आइटम समूह उत्पन्न करने में सक्षम होना चाहिए और फिर उस पर%।

<ItemGroup> 
    <Dirs Include="C:\DirA\;C:\DirB\"> 
</ItemGroup> 
<Target Name="CopyFiles" 
    Condition="Exists('%(Dirs)') AND '@(FilesToCopy)' != ''" 
    Inputs="@(FilesToCopy)" 
    Outputs="@(FilesToCopy -> '%(Dirs)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="%(Dirs)" /> 
</Target> 

या आप 2 स्पष्ट कॉल कर सकते हैं:

<Target Name="CopyFiles"> 
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="[email protected](FilesToCopy);DestDir=$(DirA)" /> 
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="[email protected](FilesToCopy);DestDir=$(DirB)" /> 
</Target> 

<Target Name="CopyASetOfFiles" 
    Condition="Exists('$(DestDir)') AND '@(FilesToCopy)' != ''" 
    Inputs="@(FilesToCopy)" 
    Outputs="@(FilesToCopy -> '$(DestDir)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DestDir)" /> 
</Target> 

मैं या तो वाक्य रचना का परीक्षण नहीं किया है, लेकिन दूसरे की अपेक्षाकृत अधिक आश्वस्त हूँ। -

(उत्तर, अगर वहाँ एक है, मेरी मेज पर मेरे सैयद हाशिमी किताब में है आप के पहले जब तक इंतज़ार करना होगा:

  1. पुस्तक प्राप्त
  2. मैं ऊब
  3. सैयद इस पोस्ट पाता है और एक शानदार परीक्षण किया जवाब के साथ
+0

हाय रूबेन। क्या आप अपनी प्रतिक्रिया में ... विस्तार कर सकते हैं? मैं समझ नहीं पा रहा हूं कि आप क्या मतलब समझने के लिए पैरामीटर किए गए लक्ष्यों से परिचित हैं। धन्यवाद। – mark

+0

@mark: किया गया।कारण मैंने दो गुना पहले किया था 1. हाथ में एक अच्छा संपादक नहीं था। 2. पहले नमूने के वाक्यविन्यास पर यकीन नहीं है। उम्मीद है की यह मदद करेगा। एमएसबिल्ड पुस्तक के अंदर अत्यधिक अनुशंसा करें –

+0

@ रूबेन: एलओएल @ # 3 –

4

हाँ, क्या आप MSBuild में बैचिंग कहा जाता है चाहते ऊपर आता है)।

;%(Dirs.Identity) 

आउटपुट में परिभाषित इस कार्य को डिर्स आइटम समूह में प्रत्येक आइटम के लिए निष्पादित करने का कारण बन जाएगा।

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="CopyFiles" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="3.5"> 

<ItemGroup> 
    <Dirs Include="C:\DirA" /> 
    <Dirs Include="C:\DirB" /> 
</ItemGroup> 

<Target Name="CopyFiles" 
    Inputs="@(FilesToCopy);@(Dirs)" 
    Outputs="@(FilesToCopy -> '%(Dirs.Identity)%(Filename)%(Extension)');%(Dirs.Identity)" > 
    <Message Text="%(Dirs.Identity)" /> 
</Target> 

</Project> 

आउटपुट:

Build started 8/19/2009 10:11:57 PM. 
Project "D:\temp\test.proj" on node 0 (default targets). 
    C:\DirA 
CopyFiles: 
    C:\DirB 
Done Building Project "D:\temp\test.proj" (default targets). 

बदलें संदेश कार्य निम्नलिखित शर्त के साथ काम करने के लिए कॉपी और आप कर रहे हैं:

Condition="Exists('%(Dirs.Identity)') AND '@(FilesToCopy)' != ''" 
संबंधित मुद्दे