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

标签 msbuild msbuild-propertygroup

我正在尝试创建一个 msbuild 项目,其中从文本文件读取依赖项信息。我有一个名为 project.dep 的文本文件,其中包含以分号分隔的项目名称列表。在此示例中,文件包含 a;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

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

最佳答案

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

更改此:

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

对此:

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

关于从函数初始化的 msbuild 属性无法转换为项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6522633/

相关文章:

msbuild - 如何在没有可编译代码的 C# 项目上使用 MSBuild

.net - 对 csproj 的更改未生效

c# - 为 Visual Studio 中的所有构建定义条件常量

msbuild-4.0 - 当您导入另一个 msbuild 文件时,评估的顺序是什么?

msbuild - 如何使用msbuild替换文件中的字符串?

msbuild - 如何使用 MSbuild 向多个地址发送电子邮件

visual-studio-2010 - 从解决方案中删除 nuget 包恢复

msbuild - 如何在 Bitbucket Pipelines 中构建子文件夹

msbuild - 团队服务构建工件