Ответ 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
)