Проблема в том, что вы используете задачу ReadLinesFromFile
так, как она не предназначена.
ReadLinesFromFile Task
Читает список элементов из текстового файла.
Таким образом, это не просто чтение всего текста из файла, это чтение отдельных элементов из файла и возврат группы элементов 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
)