2011-08-03 18 views
8

क्या एमएसबिल्ड बैचिंग का उपयोग करते समय प्रत्येक आउटपुट के लिए निर्भरता-जांच के लिए संभव है?एमएसबिल्ड प्रत्येक आउटपुट में एकाधिक इनपुट बैचिंग

मैंने सोचा कि मैं आउटपुट फ़ाइल के मेटाडाटा में मेरी आदानों सूची का निर्माण करके इस के लिए एक समाधान पाया था, इस प्रकार है:

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Outputs="@(Foo)" Inputs="%(Foo.Inputs)"> 
    <FooCompiler Src="%(Foo.Inputs)" Out="@(Foo)" /> 
</Target> 

हालांकि, MSBuild शिकायत है कि फ़ाइल "input1a; input1b" करता है मौजूद नहीं। ऐसा लगता है कि स्ट्रिंग-> आइटम रूपांतरण अभिव्यक्ति मूल्यांकन से पहले होता है।

क्या मेरी अपनी निर्भरता जांच लिखने के अलावा अन्य कोई समाधान है?

+0

'आउटपुट' और 'इनपुट' लक्ष्य विशेषताओं को निकालने का प्रयास करें। – Mrchief

+0

फिर यह निर्भरता जांच नहीं करेगा, यह हमेशा प्रत्येक आइटम के लिए FooCompiler चलाएगा। –

+0

यह निर्भरता जांच कहां कर रहा है? – Mrchief

उत्तर

18

एकाधिक निर्भरताओं की जांच करना यदि आइटम समूह संकलन परिणाम के साथ मेटाडेटा के रूप में दूसरे तरीके से स्थापित किया गया है।

<ItemGroup> 
    <Foo Include="input1a"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input1b"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input2a"> 
    <Result>output2</Result> 
    </Foo> 
    <Foo Include="input2b"> 
    <Result>output2</Result> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Inputs="@(Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(Foo)" Out="%(Foo.Result)"/> 
</Target> 

और बजाय मैन्युअल Foo आइटम समूह परिवर्तित करने की है, तो आप एक नया आइटम समूह _Foo निर्माण इस प्रकार एक शर्त लक्ष्य में इस बदल सकता है।

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_PrepareItemsForCompileFoo"> 
    <ItemGroup> 
    <_Foo Include="%(Foo.Inputs)"> 
     <Result>%(Foo.Identity)</Result> 
    </_Foo> 
    </ItemGroup> 
</Target> 

<Target Name="_CompileFoo" DependsOnTargets="_PrepareItemsForCompileFoo" Inputs="@(_Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(_Foo)" Out="%(_Foo.Result)"/> 
</Target> 
+0

यह पूरी तरह से काम किया, धन्यवाद! मेरे उदाहरण में आइटम वास्तव में सी # कार्य का उपयोग करके अन्य वस्तुओं को एकत्रित करके बनाए गए थे। आपके दूसरे उदाहरण के लिए धन्यवाद, मैं इसे खत्म करने में सक्षम था। –

संबंधित मुद्दे