【问题标题】:echo All Elements of an ItemGroup回显 ItemGroup 的所有元素
【发布时间】:2014-11-07 12:56:50
【问题描述】:

我有一个 MSBuild ItemGroup,我希望能够在“构建后事件”中将它 echo

但是,当我尝试以下命令时:echo My ItemGroup: @(Foo)

我得到错误:

错误 MSB4164:元数据“Command”的值“echo My ItemGroup:@(Foo)”包含项目列表表达式。默认元数据值上不允许使用项目列表表达式。

到目前为止,我对ItemGroups 还不是很好。有没有办法让我只 echo Foo 包含的文件列表?

【问题讨论】:

  • 您能否发布更多您尝试使用的代码?包含您正在尝试做的事情的 ItemGroup 标签和 Target 标签的东西将帮助我更好地理解您的问题。然后请回复我的评论,以便我收到问题已更新的通知:)
  • @ZainRizvi 因此,鉴于ItemGroup Foo 包含“a.txt;b.txt;c.txt”我想echo:“我的项目组:a.txt; b.txt;c.txt"

标签: c++ visual-c++ msbuild echo itemgroup


【解决方案1】:

改用%(Foo.Identity)。这将只打印列表中的一个项目,但会导致包含它的任务(我想是Exec)循环这些项目。

如果这不起作用,请确保直接使用 XML 文件而不是 IDE,以防它转义或放入我们看不到的其他代码。

(稍后) 可能就像this post,他们感叹它并不简单,无论如何都需要直接编辑 XML。因此,只需将其更改为 Exec 任务,其中 itemlist 表达式出现在属性中,而不是元数据定义中。

据说PostBuildEvent 更像是一种向后兼容的东西,最好使用的是AfterBuild 目标,它“能够包含任意MSBuild 任务,包括一个或多个Exec 任务...它在 IDE 中没有自定义 UI ...将其编辑为 XML ...”Brian Kretzler 书中的提示 43。

【讨论】:

  • 那不是echo 任何东西。在 .vcxproj 中echos 是这样表示的:<Command>echo My ItemGroup: @(Foo)</Command> 因为它不在 XML 属性中,我不相信“%”会导致命令循环。
  • @JonathanMee 我编辑了这个问题。它有助于查看真正的构建命令,而不仅仅是使用的 IDE 操作!
  • 我实际上是 am 使用AfterBuild 事件。我试图在PostBuildEvent 中写的echo 只是为了告诉我所有使用PostBuildEvent 的同事:“嘿,我正在使用AfterBuild 目标将这些文件复制到这里。”
  • 您与stackoverflow.com/q/6780985/2642059 的链接有效。但我必须创建一个PropertyGroup 并将其输出到echoPropertyGroup 包含:<FooOutput>@(Foo->'%(FullPath)')<\FooOutput>echo 声明内容为:echo My ItemGroup: $(FooOutput) 我想这在技术上回答了这个问题,但我希望在没有中间 PropertyGroup 的情况下这样做。
  • 所以将 echo 命令(通过 Exec 任务)放在与 AfterBuild 当前工作相同的目标中。 (Target,不是Event,后者是指包含命令作为item的特殊item list)
【解决方案2】:

你会想要这样的东西:

<ItemGroup>
  <ForcedUsingFilesList Include="c:\path\to\files\*" />
</ItemGroup>
<Target Name="MyTarget">
  <PropertyGroup>
    <MyFiles>
        @(ForcedUsingFilesList->'%(FullPath)')
    </MyFiles>
  </PropertyGroup>
  <Exec>echo $(MyFiles)</Exec>
</Target>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2011-04-11
    • 2020-09-20
    • 2020-08-13
    • 2019-09-04
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多