2010-01-06 12 views
7

मैं एक फ़ाइल के सापेक्ष पथ के साथ आबादी वाले "लक्ष्यपैथ" नामक मेटाडेटा विशेषता वाले "फ़ाइलें" कार्य आइटम समूह बनाने की कोशिश कर रहा हूं।फाइलग्रुप के साथ कस्टम मेटाडाटा के साथ आइटम समूह

उदाहरण:
इन रास्तों के लिए:

डी: \ टेस्ट \ Blah.exe
डी: \ टेस्ट \ Config \ fun.config
डी: \ टेस्ट \ en-US \ मेरी .resources.dll

उत्पादन किया जाना चाहिए:

फ़ाइल लक्ष्य = Blah.exe +०१२३८००७३१ फ़ाइल लक्ष्य = कॉन्फ़िग \ fun.config
फ़ाइल लक्ष्य = en-US \ my.resources.dll

यहाँ मेरी सबसे अच्छा प्रयास ... उम्मीद है कि इस बनाता है मेरे सवाल का स्पष्ट:

<ItemGroup> 
    <Files Include="d:\test\**\*" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(TargetPath)')"/> 

मुझे "लक्ष्यपैथ" सही ढंग से आबादी चाहिए ... वर्तमान में यह शून्य या खाली प्रतीत होता है। किसी को पता है कि मैं क्या खो रहा हूँ?

संपादित करें:

हाँ, मुझे पता है मैं यह कर सकता:

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

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

उत्तर

6

आप इसे बनाए जाने से पहले किसी आइटम समूह में गतिशील मेटाडेटा असाइन करने का प्रयास कर रहे हैं। अपने उदाहरण में के बाद से इस जानकारी को पहले से ही अच्छी तरह से ज्ञात मेटाडाटा का हिस्सा है कस्टम मेटाडाटा बनाने के लिए कोई आवश्यकता नहीं है, तो आप सिर्फ कर सकते हैं:

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

या:

<Message Text="File Target = %(Files.RecursiveDir)%(Files.Filename)%(Files.Extension)"/> 

संपादित करें:

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<CreateItem 
    Include="@(Files)" 
    AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)"> 
     <Output TaskParameter="Include" ItemName="Files"/> 
</CreateItem> 
:

यह उदाहरण गतिशील itemgroup अद्यतन करने के लिए CreateItem कार्य का उपयोग करता है

+0

मुझे लगता है कि, हालांकि मैं इस मेटाडाटा विशेषता है करने के लिए किसी अन्य कार्य कि TaskItems मैं इसे करने के लिए पारित पर निर्भर करता है का उपयोग करने के कोशिश कर रहा हूँ देख –

+0

मेरी देखें उत्तर अपडेट करें - उम्मीद है कि यह मदद करता है। – KMoraz

0

मैं इस तरह का उपयोग करने के CreateItem विधि पसंद कर रहा हूँ:

<ItemGroup> 
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    ... 
    </ItemGroup> 

    <CreateItem Include="@(Reference)" Condition="'%(Reference.Private)' == 'True'" AdditionalMetadata="TargetPath=$([System.IO.Path]::GetFileName(%(Reference.HintPath)))"> 
    <Output TaskParameter="Include" ItemName="DLLFiles"/> 
    </CreateItem> 

    <Message Text="HintPaths: &quot;@(DLLFiles->'$(OutputPath)%(TargetPath)')&quot;" Importance="high" /> 

मैं Transforms उपयोग कर रहा हूँ बस केवल फ़ाइल नाम पाने के लिए।

आउटपुट:

HintPaths: "बिन \ रिलीज \ log4net।dll; बिन \ रिलीज \ Newtonsoft.Json.dll; बिन \ रिलीज \ RabbitMQ.Client.dll; बिन \ रिलीज \ ReflectSoftware.Insight.dll "

1

आधुनिक MSBuild CreateTask (की आवश्यकता नहीं है .NET 3.5 के बाद से)

आप इस तरह यह कर सकते हैं:।।

<ItemGroup> 
    <Files Include="d:\test\**\*" /> 
    <FilesWithMetadata Include="%(Files.Identity)" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </FilesWithMetadata> 
</ItemGroup> 
संबंधित मुद्दे