【问题标题】:In MSBuild, why isn't Item Metadata, within a property, being resolved?在 MSBuild 中,为什么不解析属性中的项元数据?
【发布时间】:2012-04-14 13:06:05
【问题描述】:

以下是我正在处理的 MSBuild 文件的一部分:

<ItemGroup>
  <Tests Include="$(SolutionDir)\**\bin\$(TestPlatform)\$(Configuration)\*.Tests.dll" />
</ItemGroup>

<PropertyGroup>
  <TestProperties>/testcontainer:%(Tests.FullPath)</TestProperties>
</PropertyGroup>

我想要一个包含命令行开关的属性。但是,当我尝试在 Exec Command 字符串中使用 $(TestProperties) 时,%(Tests.FullPath) 永远不会解析为 Tests 项的绝对路径。相反,它总是按字面意思处理,如"%(Tests.FullPath)"

我做错了什么还是这是标准的 MSBuild 行为?如果是后者,我有办法解决这个问题吗?

谢谢

附: - 我意识到我可能不需要访问 FullPath 属性,因为我的 Include 值是绝对路径。但是,我仍然想了解这个问题,以及如何处理它。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    您有语法错误。项目列表通过 @ 字符引用,项目元数据通过 % 引用。详情请参考MSBuild Special Character Reference。要访问众所周知的项目元数据,您需要在属性本身内应用转换。

    <ItemGroup>
      <Tests Include="MyFile.txt" />
    </ItemGroup>
    
    <PropertyGroup>
      <TestProperties>/testcontainer:@(Tests->'%(FullPath)')</TestProperties>
    </PropertyGroup>
    

    您可以找到更多帮助here

    【讨论】:

    • 除非这也不起作用:“项目列表不能与需要项目列表的其他字符串连接。使用分号分隔多个项目列表。”
    • 我不知道你在说什么。这会像 OP 所要求的那样解析项目元数据。
    • 确实如此,但前提是在目标内部使用。在目标之外,它会产生我发布的错误。
    • 这是有道理的,msbuild 的评估阶段会分配内容,而不是结果。目标被执行的执行阶段会导致扩展发生,并且扩展的结果被放入项目中。
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多