从函数初始化的msbuild属性无法转换为项目?

时间:2011-06-29 14:49:40

标签: msbuild msbuild-propertygroup

我正在尝试创建一个msbuild项目,其中从文本文件中读取依赖项信息。我有一个名为project.dep的文本文件,其中包含一个以分号分隔的项目名称列表。在此示例中,该文件包含; b; c; d

我希望下面的代码生成两个相同的项目列表:

<PropertyGroup>
    <from_file>$([System.IO.File]::ReadAllText($(ProjectName).dep))</from_file>
    <inline>a;b;c;d</inline>
</PropertyGroup>

<ItemGroup>
    <from_file_items Include="$(from_file)" />
    <inline_items Include="$(inline)" />
</ItemGroup>

<Target Name="Test">
    <Message Text="file: @(from_file_items->'%(filename).item')" />
    <Message Text="inline: @(inline_items->'%(filename).item')" />
</Target>

但结果却不同:

Test:
    file: a;b;c;d.item
    inline: a.item;b.item;c.item;d.item

这不是我的预期。我需要将文件中的每个名称映射到单独的项目。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

从文件中读取时,整个内容被视为单个项目,因此“a; b; c; d” - 在定义@(from_file_items)时传入项目规范时 - 不会被拆分与传递给@(inline_items)时的方式相同。 MSBuild正在逃避价值,你需要对其进行解读。

改变这个:

<from_file_items Include="$(from_file)" />

到此:

<from_file_items Include="$([MSBuild]::Unescape($(from_file)))" />