deployment msbuild msbuild-task msbuildcommunitytasks

deployment - MSBuild ReadLinesFromFile todo el texto en una línea



msbuild-task msbuildcommunitytasks (4)

En lugar de @ (FileContents -> ''% (Identity)'', ''% 0a% 0d''), creo que puede hacer @ (FileContents, ''% 0a% 0d'')

Cuando hago un ReadLinesFromFile en un archivo en MSBUILD y voy a mostrar ese archivo de nuevo, obtengo todo el texto en una línea. Todos los devoluciones de carro y LineFeeds se eliminan.

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

Obtengo el texto del archivo que normalmente se ve así

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

Saliendo así

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

Sé que el código para ReadLinesFromFile extraerá los datos en una línea a la vez y quitará los retornos de carro.

¿Hay alguna manera de volver a ponerlos? ¿Mi correo electrónico se ve muy bien formateado?

Gracias


Si está utilizando MSBuild 4.0, puede hacer lo siguiente para obtener el contenido de un archivo:

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


El problema aquí es que está utilizando la tarea ReadLinesFromFile de una manera que no fue intencionada.

Tarea ReadLinesFromFile
Lee una lista de elementos de un archivo de texto.

Por lo tanto, no es solo leer todo el texto de un archivo, sino leer elementos individuales de un archivo y devolver un grupo de elementos de ITaskItems. Siempre que muestre una lista de elementos utilizando la sintaxis @() obtendrá una lista separada, cuyo valor predeterminado es un punto y coma. Este ejemplo ilustra este comportamiento:

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

Y la salida se ve así:

ItemGroup Color: Red;Blue;Green

Entonces, si bien la mejor solución para su problema es escribir una tarea MSBuild que lea un archivo en una propiedad como una cadena y no como una lista de elementos, eso realmente no es lo que usted solicitó. Usted preguntó si había alguna manera de volver a colocarlos, y está usando Transformaciones de MSBuild .

Las transformaciones se usan para crear una lista de otra y también tienen la capacidad de transformarse utilizando un separador personalizado. Así que la respuesta es transformar su lista de lectura utilizando ReadItemsFromFile en otra lista con nuevas líneas. Aquí hay un ejemplo que hace justamente eso:

<?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 se ve así:

Red Green Blue

Y la salida se ve así:

[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

Lo que está pasando aquí son dos cosas.

@(FileContents->''%(Identity)'', ''%0a%0d'')

  • Estamos transformando la lista de un tipo a otro usando los mismos valores ( Identity ) pero un separador personalizado ''%0a%0d''
  • Estamos utilizando MSBuild Escaping para escapar de la alimentación de línea ( %0a ) y del retorno de carro ( %0d )

Puede usar WriteLinesToFile combinado con

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

Esto copiará su archivo exactamente allí.