मैं बेहद उत्सुक हूं कि मैं मेटाडेटा स्थिति के आधार पर वैश्विक दायरे में कोई आइटम बनाने में असमर्थ क्यों हूं जो लक्ष्य के अंदर अपेक्षित काम करता है। उदाहरण के लिए, इस उम्मीद के रूप में काम करता है:वैश्विक स्कोप में 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) '==' सच ' "।
तो क्या देता है? निश्चित रूप से मैं इसके आसपास काम कर सकता हूं, लेकिन मैं आइटम समूह, मेटाडेटा और/या वैश्विक दायरे के बारे में क्या समझ नहीं पा रहा हूं?
निश्चित रूप से, आप लक्ष्य के बाहर बैचिंग का उपयोग नहीं कर सकते हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि पार्सर केवल एक बार वैश्विक दायरे को पढ़ता है (इसलिए इसमें कोई परिभाषा नहीं है कि इसमें क्या परिभाषित किया गया है जब यह पार्स => कोई बैचिंग संभव नहीं है)। आइटम समूह और CreateItem के बीच के अंतर के लिए आप इन विषयों को पढ़ सकते हैं: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup और http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- बहिष्कार-पैटर्न-समस्या –
दस्तावेज़ (अब?) कहते हैं कि ['CreateItem' बहिष्कृत है] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), इसलिए जब तक आवश्यक हो, मैं इसे उपयोग करने से बचूंगा (मुझे लगता है कि यह 'आइटम समूह' की तुलना में पैरामीटर को अधिक आक्रामक रूप से फैलाता है) क्योंकि, बहुत दूर भविष्य में, शायद इसे .NET ;-) में शामिल नहीं किया जाएगा। इस प्रकार, यह शायद "सिंटेक्टिक चीनी" नहीं है। – binki