Подтвердить что ты не робот

MSBuild ReadLinesFromFile весь текст в одной строке

Когда я делаю ReadLinesFromFile в файле в MSBUILD и снова выхожу для вывода этого файла, я получаю весь текст в одной строке. Все возвраты каретки и LineFeeds удаляются.

<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()""

Я знаю, что код ReadLinesFromFile будет вытаскивать данные в одну строку за раз и вычеркивать возврат каретки.

Есть ли способ вернуть их? Итак, моя электронная почта выглядит хорошо отформатированной?

Спасибо

4b9b3361

Ответ 1

Проблема здесь в том, что вы используете задачу 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), но пользовательский разделитель '%0a%0d'
  • Мы используем MSBuild Escaping, чтобы избежать подачи строки (%0a) и возврата каретки (%0d)

Ответ 2

Если вы используете MSBuild 4.0, вы можете сделать следующее вместо этого, чтобы получить содержимое файла:

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

Ответ 3

Вместо @(FileContents → '% (Identity)', '% 0a% 0d') Я считаю, что вы можете делать @(FileContents, '% 0a% 0d')

Ответ 4

Вы можете использовать WriteLinesToFile в сочетании с

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

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

Это скопирует ваш файл именно на нем.