Pergunta

Quando eu faço um ReadLinesFromFile em um arquivo no MSBUILD e ir para a saída que arquivo novamente, eu recebo todo o texto em uma linha. Toda a retornos de carro e alimentações de linha são retirados.

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

Eu recebo o texto do arquivo que normalmente se parece com isso

- New Deployment Tool for BLAH

- Random other stuff()""

Ao sair como esta

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

Eu sei que o código para ReadLinesFromFile vai puxar os dados em uma linha de cada vez e retirar os retornos de carro.

Existe uma maneira de colocá-los de volta? Então minha aparência e-mail todas as bem formatada?

Graças

Foi útil?

Solução

O problema aqui é que você está usando a tarefa ReadLinesFromFile de uma maneira que não se destinava.

ReadLinesFromFile Task
Lê uma lista de itens a partir de um arquivo de texto.

Portanto, não é apenas a leitura de todo o texto de um arquivo, ele está lendo itens individuais de um arquivo e retornar um grupo de itens de ITaskItems. Sempre que você saída uma lista de itens usando o @() sintaxe você receberá uma lista separada, o padrão de que é um ponto e vírgula. Este exemplo ilustra esse comportamento:

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

E a aparência da saída como esta:

  ItemGroup Color: Red;Blue;Green

Assim, enquanto a melhor solução para o seu problema é escrever uma tarefa MSBuild que lê um arquivo em um propriedade como uma cadeia de um não uma lista de itens, isso não é realmente o que você pediu. Você perguntou se havia um maneira para colocá-los de volta, e não está usando MSBuild transformações .

As transformações são usadas para criar uma lista de outra e também tem a capacidade de transformar usando um separador personalizado. Portanto, a resposta é transformar sua lista de leitura em usar ReadItemsFromFile em outra lista com novas linhas. Aqui está um exemplo que faz exatamente isso:

<?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 parece com:

Red
Green
Blue

E a aparência da saída como esta:

[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

O que está acontecendo aqui é duas coisas.

@(FileContents->'%(Identity)', '%0a%0d')   
  • Estamos transformando a lista de um tipo para outro usando os mesmos valores (Identity), mas um costume separador '%0a%0d'
  • Nós estamos usando MSBuild Escaping para escapar do avanço de linha (%0a ) e retorno de carro (%0d)

Outras dicas

Se você estiver usando MSBuild 4.0, você pode fazer o seguinte em vez disso, para obter o conteúdo de um arquivo:

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

Em vez de @ (fileContents -> '% (Identidade)', '% 0a% 0d') Eu acredito que você pode fazer @ (fileContents, '% 0a% 0d')

Você pode usar WriteLinesToFile combinado com

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

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

Isto irá copiar o arquivo exatamente no que é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top