Проблема здесь вы используете 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
)
Это именно то, что я искал, спасибо, чувак! Я знал, что могу сделать это, написав пользовательскую задачу, но я бы предпочел не иметь кучу пользовательских задач о месте, если я могу сделать это с учетом синтаксиса. Еще раз спасибо !! :-) – evilhomer 2008-11-08 16:08:22