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

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

<Project DefaultTargets = "Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Import  Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.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 будет вытягивать данные в одной строке за раз и удалять каретку возвращается.

есть ли способ вернуть их обратно? Значит, мой e-mail выглядит красиво отформатированным?

спасибо

4 ответов


проблема здесь в том, что вы используете 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>

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

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

вместо @(FileContents->'%(идентичности)', '%0а%0d с') Я верю, что ты можешь делать @(FileContents, '%0а%0d с')


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

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

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

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