2010-07-16 13 views
6

मैं बेहद उत्सुक हूं कि मैं मेटाडेटा स्थिति के आधार पर वैश्विक दायरे में कोई आइटम बनाने में असमर्थ क्यों हूं जो लक्ष्य के अंदर अपेक्षित काम करता है। उदाहरण के लिए, इस उम्मीद के रूप में काम करता है:वैश्विक स्कोप में MSBuild ItemGroup सशर्त काम क्यों नहीं करता

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 

    <ItemGroup> 
     <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
    </ItemGroup> 

    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

और निम्नलिखित उत्पादन का उत्पादन:

TestItem1; TestItem2 TestItem1 TestItem1 TestItem1

और इस रूप में काम करता अपेक्षित:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'false'=='true'" /> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 


    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

उत्पादन निम्नलिखित उत्पादन:

TestItem1; TestItem2 TestItem1

लेकिन इस:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
</ItemGroup> 

निम्नलिखित MSBuild त्रुटि का उत्पादन:

temp.proj (13,45): त्रुटि MSB4090: मिले एक अप्रत्याशित चरित्र '%' स्थिति 2 पर हालत में " '% (TestItems.TestFlag) '==' सच ' "।

तो क्या देता है? निश्चित रूप से मैं इसके आसपास काम कर सकता हूं, लेकिन मैं आइटम समूह, मेटाडेटा और/या वैश्विक दायरे के बारे में क्या समझ नहीं पा रहा हूं?

उत्तर

4

आइटम समूह की स्थिति किसी लक्ष्य के बाहर काम करती है, लेकिन बैचिंग नहीं है (वह "%" ऑपरेटर है)। जब आप कोई कार्य कहते हैं तो बैचिंग का उपयोग किया जाता है, और चूंकि आप केवल एक लक्ष्य के अंदर से एक कार्य को कॉल कर सकते हैं, यह केवल लक्ष्य के अंदर काम करने के लिए बैचिंग के लिए समझ में आता है।

आप पूछ सकते हैं कि आइटम समूह लक्ष्य के अंदर क्यों काम करता है क्योंकि यह कोई कार्य नहीं है। एमएसबिल्ड 3.5 से पहले, आपको आइटम समूहों को लक्ष्य के अंदर अनुमति नहीं थी; आपको इसके बजाय CreateItem पर कॉल करना पड़ा था। संस्करण 3.5 और 4.0 में, आइटम समूहों का उपयोग करने की अनुमति है, लेकिन मुझे लगता है कि यह CreateItem कार्य को कॉल करने के लिए सिंटैक्टिक चीनी है, इसलिए आपकी स्थिति काम करती है क्योंकि दृश्यों के पीछे एक कार्य है।

+0

निश्चित रूप से, आप लक्ष्य के बाहर बैचिंग का उपयोग नहीं कर सकते हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि पार्सर केवल एक बार वैश्विक दायरे को पढ़ता है (इसलिए इसमें कोई परिभाषा नहीं है कि इसमें क्या परिभाषित किया गया है जब यह पार्स => कोई बैचिंग संभव नहीं है)। आइटम समूह और CreateItem के बीच के अंतर के लिए आप इन विषयों को पढ़ सकते हैं: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup और http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- बहिष्कार-पैटर्न-समस्या –

+2

दस्तावेज़ (अब?) कहते हैं कि ['CreateItem' बहिष्कृत है] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), इसलिए जब तक आवश्यक हो, मैं इसे उपयोग करने से बचूंगा (मुझे लगता है कि यह 'आइटम समूह' की तुलना में पैरामीटर को अधिक आक्रामक रूप से फैलाता है) क्योंकि, बहुत दूर भविष्य में, शायद इसे .NET ;-) में शामिल नहीं किया जाएगा। इस प्रकार, यह शायद "सिंटेक्टिक चीनी" नहीं है। – binki

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