2010-08-10 4 views
5

मैं 2 फाइलों के लिए रिलीज तत्वों को पकड़ने और बनाने के लिए एमएसबिल्ड का उपयोग करना चाहता हूं। यदि यह बस एक ही फाइल एक्सटेंशन था, मैं प्रयोग करेंगे:एमएसबिल्ड: सिल्वरलाइट निर्माण में "* .xaml" और "* .cs" दोनों को कैसे शामिल करें?

<ItemGroup> 
    <Compile Include="Pages\SilverlightControl1.xaml.cs"> 
     <DependentUpon>SilverlightControl1.xaml</DependentUpon> 
    </Compile> 
    <Compile Include="Pages\SilverlightControl2.xaml.cs"> 
     <DependentUpon>SilverlightControl2.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 
:

<ItemGroup> 
    <Compile Include="\Pages\*.cs" /> 
</ItemGroup> 

एक .csproj फ़ाइल में एक सिल्वरलाइट निर्माण के लिए, प्रत्येक UserControl के साथ अपने आप <Compile> तत्व और एक बच्चे <DependentUpon> तत्व की तरह सेट किया गया है

MSBuild फ़ाइल में, मैं उल्लेख करना चाहते हैं:

हड़पने सभी .cs फ़ाइलों औरमें उन डाल विशेषता और एक ही फ़ाइल नाम प्राप्त करें - .cs घटाएं और इसे <DependentUpon> तत्व में रखें।

तो यह है कि यह सिर्फ (छद्म) की तरह कुछ फ़ाइल जोड़े मिलान करने के लिए किया जाएगा:

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>Pages\*.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 

वहाँ एक रास्ता MSBuild में ऊपर रखूँ है?

उत्तर

4

एमएसबिल्ड के पास दो अलग मेटाडेटा गुण हैं जिन्हें %(Filename) कहा जाता है (जो एक्सटेंशन के बिना फ़ाइल नाम है) और %(Extension) जो आपके उदाहरण में ".cs" होगा। तो, मुझे आश्चर्य है अगर यह संभव है:

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </Compile> 
</ItemGroup> 

लेकिन, मुझे नहीं लगता कि आप इसे करने वाला है या यहां तक ​​कि क्या आप इसे करना चाहते हैं क्या पसंद करेंगे है।

आप वास्तव में होना चाहिए ही कभी "ग्लोब" प्रकार आइटम (* .cs) भीतर लक्ष्य है - आप इसे एक शीर्ष स्तर आइटम समूह के रूप में घोषित नहीं करना चाहिए, अन्यथा यह दृश्य स्टूडियो और में अजीब काम करेंगे (के लिए उदाहरण) सभी .cs फ़ाइलों को संस्करण नियंत्रण में जोड़ देगा और शायद आपके प्रोजेक्ट में * .cs को अलग-अलग आइटमों में भी विस्तारित करेगा।

यहाँ मैं एक गैर दृश्य स्टूडियो MSBuild परियोजना में सुझाव है कि है:

<Target Name="PrepareCompileItems"> 
    <XamlFiles Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Include="@(XamlFiles)" /> 
</Target> 

यदि आप एक वी.एस. परियोजना के भीतर इस कर रहे थे, तो यह चालबाज है - क्योंकि आप पहले से मौजूद किसी को मेटाडेटा जोड़ने करना चाहते हैं itemgroup संकलन से पहले dependentUpon संघ मजबूर करने के लिए:

<Target Name="AddDependentUponMetadata"> 
    <CsFiles Include="Pages\*.cs" /> 

    <XamlFiles Include="@(CsFiles)"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Remove="@(CsFiles)" />  
    <Compile Include="@(XamlFiles)" /> 
</Target> 

हालांकि, मैं वास्तव में तो मेरे कथनों का परीक्षण YMMV के बिना इस टाइप कर रहा हूँ ...

+0

धन्यवाद पीटर, मैं इसके साथ खिलौना रखूंगा और देख सकता हूं कि मैं इसे काम पर ला सकता हूं या नहीं। –

2

MSBuild में आप नीचे की तरह कर सकते हैं:

<ItemGroup> 
     <ClassFiles Include="**\*.cs"/> 
     <XamlFiles Include="**\*.xaml"/> 
     <Compile Include="@(ClassFiles)" > 
      <DependentUpon>"@(XamlFiles)"</DependentUpon> 
     </Compile> 
    </ItemGroup> 

आप यही चाहते या मैं अपने प्रश्न से दूर कर रहा हूँ है?

+0

धन्यवाद मैल्कम, मैं देखूंगा कि मैं इसे काम पर ला सकता हूं या नहीं। –

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