2008-11-07 17 views
13

जब मैं MSBUILD में किसी फ़ाइल पर रीडलाइनसफ्रफ़ाइल करता हूं और उस फ़ाइल को फिर से आउटपुट पर जाता हूं, तो मुझे एक ही पंक्ति में सभी टेक्स्ट मिलते हैं। सभी कैरिज रिटर्न और लाइन फीड्स अलग हो गए हैं।MSBuild ReadLinesFromFile एक पंक्ति पर सभी पाठ

<Project DefaultTargets = "Deploy" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

<ItemGroup> 
    <MyTextFile Include="$(ReleaseNotesDir)$(NewBuildNumber).txt"/> 
</ItemGroup> 

<Target Name="ReadReleaseNotes"> 
    <ReadLinesFromFile 
     File="@(MyTextFile)" > 
     <Output 
      TaskParameter="Lines" 
      ItemName="ReleaseNoteItems"/> 
    </ReadLinesFromFile> 
</Target> 

<Target Name="MailUsers" DependsOnTargets="ReadReleaseNotes" > 
    <Mail SmtpServer="$(MailServer)" 
     To="$(MyEMail)" 
     From="$(MyEMail)" 
     Subject="Test Mail Task" 
     Body="@(ReleaseNoteItems)" /> 
</Target> 
<Target Name="Deploy"> 
    <CallTarget Targets="MailUsers" /> 
</Target> 

</Project> 

मैं फ़ाइल जो आम तौर पर लगता है कि यह

- New Deployment Tool for BLAH 

- Random other stuff()"" 

इस

- New Deployment Tool for BLAH;- Random other stuff()"" 

की तरह बाहर आ रहा है से पाठ मिलता है मुझे लगता है कि कोड पता ReadLinesFro के लिए एमफाइल डेटा को एक समय में एक पंक्ति में खींच देगा और कैरिज रिटर्न को हटा देगा।

क्या उन्हें वापस रखने का कोई तरीका है? तो मेरा ई-मेल सभी अच्छी तरह से स्वरूपित दिखता है?

धन्यवाद

उत्तर

40

समस्या यहाँ आप एक तरह से यह इरादा नहीं था में ReadLinesFromFile कार्य का उपयोग कर रहे है।

ReadLinesFromFile टास्क
एक पाठ फ़ाइल से मदों की एक सूची पढ़ता है।

तो यह सिर्फ फाइल से सभी पाठ नहीं पढ़ रहा है, यह फ़ाइल से अलग-अलग आइटम पढ़ रहा है और ITaskItems के आइटम समूह को वापस कर रहा है। जब भी आप @() सिंटैक्स का उपयोग करके वस्तुओं की एक सूची आउटपुट करते हैं तो आपको एक अलग सूची मिल जाएगी, जिसमें से डिफ़ॉल्ट अर्धविराम है। यह उदाहरण इस व्यवहार दिखाता है:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 

    <ItemGroup> 
     <Color Include="Red" /> 
     <Color Include="Blue" /> 
     <Color Include="Green" /> 
</ItemGroup> 

<Target Name="Build"> 
     <Message Text="ItemGroup Color: @(Color)" /> 
</Target> 

</Project> 

और उत्पादन इस तरह दिखता है:

ItemGroup Color: Red;Blue;Green 

इसलिए जब आपकी समस्या का सबसे अच्छा समाधान एक MSBuild कार्य है कि एक संपत्ति में एक फ़ाइल पढ़ता लिखना है एक स्ट्रिंग के रूप में वस्तुओं की एक सूची नहीं है, यह वास्तव में वह नहीं है जिसे आपने पूछा था। आपने पूछा कि क्या उन्हें वापस रखने के लिए रास्ता था, और MSBuild Transforms का उपयोग कर रहा है।

ट्रांसफॉर्म का उपयोग दूसरे से एक सूची बनाने के लिए किया जाता है और कस्टम सेपरेटर का उपयोग करके बदलने की क्षमता भी होती है। तो जवाब आपकी सूची को ReadItemsFromFile का उपयोग न्यूलाइन के साथ किसी अन्य सूची में बदलने के लिए है। यहाँ एक उदाहरण है कि करता है सिर्फ इतना है कि:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 

    <ItemGroup> 
     <File Include="$(MSBuildProjectDirectory)\Test.txt" /> 
    </ItemGroup> 

    <Target Name="Build"> 
     <ReadLinesFromFile File="@(File)"> 
      <Output TaskParameter="Lines" ItemName="FileContents" /> 
     </ReadLinesFromFile> 

     <Message Text="FileContents: @(FileContents)" /> 
     <Message Text="FileContents Transformed: @(FileContents->'%(Identity)', '%0a%0d')" /> 
    </Target> 

</Project> 

Test.text की तरह दिखता है:

Red 
Green 
Blue 

और उत्पादन इस तरह दिखता है:

[C:\temp]:: msbuild test.proj 
Microsoft (R) Build Engine Version 3.5.21022.8 
[Microsoft .NET Framework, Version 2.0.50727.1433] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 11/8/2008 8:16:59 AM. 
Project "C:\temp\test.proj" on node 0 (default targets). 
    FileContents: Red;Green;Blue 
    FileContents Transformed: Red 
Green 
Blue 
Done Building Project "C:\temp\test.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.03 

यहाँ क्या हो रहा है दो बातें है ।

@(FileContents->'%(Identity)', '%0a%0d') 
  • हम एक ही मान (Identity), लेकिन हम MSBuild Escaping उपयोग कर रहे हैं लाइन फ़ीड (%0a) और गाड़ी वापसी से बचने के लिए (एक कस्टम विभाजक '%0a%0d'
  • का उपयोग कर एक और करने के लिए एक प्रकार से सूची बदलने रहे हैं %0d)
+2

वही है जो मैं धन्यवाद दोस्त की तलाश में था !! मुझे पता था कि मैं इसे एक कस्टम कार्य लिख सकता हूं, लेकिन अगर मैं इसे सिंटैक्स के साथ कर सकता हूं तो मुझे जगह के बारे में कस्टम कार्यों का गुच्छा नहीं होगा। फिर से धन्यवाद !! :-) – evilhomer

3
@ करने के बजाय

(FileContents -> '% (पहचान)', '% 0A% 0 d') मेरा मानना ​​है कि आप कर सकते हैं @ (FileContents, '% 0A% 0 d')

33

आप MSBuild 4.0 का उपयोग कर रहे हैं, तो आप एक फ़ाइल की सामग्री को प्राप्त करने के लिए, निम्न बजाय कर सकते हैं:

$([System.IO.File]::ReadAllText($FilePath)) 
+5

बहुत बढ़िया! MSBuild में अनुमति दी गई .NET से अन्य उपयोगी सामग्री के लिए http://blogs.msdn.com/b/visualstudio/archive/2010/04/02/msbuild-property-functions.aspx देखें – Mike

1

आप WriteLinesToFile उपयोग कर सकते हैं

$([System.IO.File]::ReadAllText($(SourceFilePath))): 

< WriteLinesToFile File="$(DestinationFilePath)" Lines="$([System.IO.File]::ReadAllText($(SourceFilePath)))" 
         Overwrite="true" 
         /> 

यह आपके फ़ाइल की प्रतिलिपि होगा के साथ संयुक्त बिल्कुल यह है।