【问题标题】:MSBuild: Target Inputs and Outputs fails on first executionMSBuild:目标输入和输出在第一次执行时失败
【发布时间】:2013-03-16 15:17:56
【问题描述】:

我有一个正在尝试在 MSBuild 中执行的构建目标。目标有一些输入和输出,我放在那里以加快中间构建的时间。输入文件始终存在(头文件),另一方面,输出并不总是存在(XML 文件)。

可能跳过任务的中间构建是非常可取的,因为它在性能方面非常昂贵。

无论如何,输入和输出都很好如果输出已经存在。在这种情况下,MSBuild 会发出一条非常有用的消息,指出目标已被跳过,因为所有文件都是最新的。

如果输出目录和文件不存在(第一次运行此任务),MSBuild 会失败并显示以下消息:

跳过目标 [targetname],因为它没有输出。

添加详细的详细信息告诉我原因是因为 @(OutputXML) 项目是空的。好的,那现在呢?因此,MSBuild 中的中间构建的整个概念似乎并不十分强大。

我的问题是,如何在没有输出的情况下获得中间构建的好处并仍然执行此目标? (我希望我不必求助于编写自己的任务扩展)

这是我的构建脚本的相关部分:

<ItemGroup>
    <Headers  Include="..\**\*.h" />
    <OutputXML Include="$(OutputDir)\*.xml" />
</ItemGroup>

<Target Name="Doxygen" 
        Inputs="@(Headers)"
        Outputs="@(OutputXML)" >
    <Exec ... />
</Target>

注意: 我一直在谷歌、msdn 和这个网站上寻找答案,但到目前为止都没有成功。虽然我发现了关于 MSBuild 的非常有用的信息。

【问题讨论】:

  • 嗨,克里斯,与这篇文章无关。我正在与您联系以获取有关 MSBuild 的帮助。我是 MsBuild 的新手,我希望即时生成解决方案文件。我在下面的 SO 帖子中注意到您提到您有类似的解决方案。能不能和我分享一下。谢谢。 stackoverflow.com/questions/13300294/…

标签: msbuild


【解决方案1】:

使用虚拟输出怎么样?

<ItemGroup>
 <Headers  Include="..\**\*.h" />
 <OutputXML Include="$(OutputDir)\*.xml" />
</ItemGroup>

<ItemGroup Condition="'@(OutputXML)' == ''">
 <OutputXML Include="$(OutputDir)\dummy.xml" />
</ItemGroup>

<Target Name="Doxygen" 
        Inputs="@(Headers)"
        Outputs="@(OutputXML)" >
 <Exec ... />
</Target>

将 OutputDir 设置为 dummy.xml 时,即使文件不存在,它也不再为空。通配符表示您正在搜索任何 .xml 并且没有找到,但指定一个特定的不会进行搜索,因此不关心它是否存在。

【讨论】:

  • 完美运行。谢谢,我不知道您可以再次重新定义相同的项目。但是效果很好!
猜你喜欢
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多