2008-11-07 28 views
13

Khi tôi thực hiện ReadLinesFromFile trên một tệp trong MSBUILD và chuyển đến đầu ra tệp đó lần nữa, tôi nhận được tất cả văn bản trên một dòng. Tất cả trở về Carriage và LineFeeds đều bị loại bỏ.MSBuild ReadLinesFromFile tất cả văn bản trên một dòng

<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> 

tôi nhận được văn bản từ tập tin mà thường trông như thế này

- New Deployment Tool for BLAH 

- Random other stuff()"" 

Coming ra như thế này

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

Tôi biết rằng mã cho ReadLinesFro mFile sẽ kéo dữ liệu trong một dòng tại một thời điểm và loại bỏ các dấu xuống dòng.

Có cách nào để đưa họ trở lại không? Vì vậy, e-mail của tôi trông được định dạng độc đáo?

Cảm ơn

Trả lời

40

Vấn đề ở đây là bạn đang sử dụng nhiệm vụ ReadLinesFromFile một cách nó không được dự định.

ReadLinesFromFile nhiệm
Đọc một danh sách các mục từ một tập tin văn bản.

Vì vậy, nó không chỉ đọc tất cả văn bản từ một tệp, nó đọc các mục riêng lẻ từ một tệp và trả về một nhóm mục của ITaskItems. Bất cứ khi nào bạn xuất danh sách các mục bằng cách sử dụng cú pháp @(), bạn sẽ nhận được một danh sách được phân tách, mặc định là một dấu chấm phẩy. Ví dụ này minh họa hành vi này:

<?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> 

Và đầu ra trông như thế này:

ItemGroup Color: Red;Blue;Green 

Vì vậy, trong khi các giải pháp tốt nhất cho vấn đề của bạn là viết một nhiệm vụ MSBuild mà đọc một tập tin vào một tài sản như một chuỗi không phải là một danh sách các mục, đó thực sự không phải là những gì bạn yêu cầu. Bạn đã hỏi có cách nào cách để đặt lại và đang sử dụng MSBuild Transforms.

Biến đổi được sử dụng để tạo một danh sách từ danh sách khác và cũng có khả năng chuyển đổi bằng dấu phân cách tùy chỉnh. Vì vậy, câu trả lời là để chuyển đổi danh sách của bạn đọc bằng cách sử dụng ReadItemsFromFile vào danh sách khác với dòng mới. Dưới đây là một ví dụ mà không chỉ rằng:

<?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 trông giống như:

Red 
Green 
Blue 

Và đầu ra trông như thế này:

[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 

gì đang xảy ra ở đây là hai điều .

@(FileContents->'%(Identity)', '%0a%0d') 
  • Chúng tôi đang chuyển danh sách từ loại này sang loại khác sử dụng cùng một giá trị (Identity) nhưng một tách tùy chỉnh '%0a%0d'
  • Chúng tôi đang sử dụng MSBuild Escaping để thoát khỏi thức ăn đường (%0a) và vận chuyển trở lại (%0d)
+2

Đó chính xác là những gì tôi đang tìm kiếm cám ơn !! Tôi biết tôi có thể làm điều đó bằng văn bản một nhiệm vụ tùy chỉnh, nhưng tôi không muốn có một loạt các nhiệm vụ tùy chỉnh về nơi này nếu tôi có thể làm điều đó với cú pháp trong tầm tay. Cảm ơn bạn lần nữa !! :-) – evilhomer

3

Thay vì @ (FileContents -> '% (Identity)', '% 0a% 0d') tôi tin rằng bạn có thể làm @ (FileContents, '% 0a% 0d')

33

Nếu bạn đang sử dụng MSBuild 4.0, bạn có thể làm như sau thay vào đó, để có được nội dung của một file:

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

Tuyệt vời! Đối với các nội dung hữu ích khác từ .NET được cho phép trong MSBuild, hãy xem http://blogs.msdn.com/b/visualstudio/archive/2010/04/02/msbuild-property-functions.aspx – Mike

1

Bạn có thể sử dụng WriteLinesToFile kết hợp với

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

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

này sẽ sao chép tập tin của bạn chính xác ở đó là.

Các vấn đề liên quan