gpt4 book ai didi

MSBuild:首次执行时目标输入和输出失败

转载 作者:行者123 更新时间:2023-12-02 11:39:19 27 4
gpt4 key购买 nike

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

可能跳过该任务的中间构建是非常可取的,因为它在性能方面的成本相当高。

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

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

Skipping target [targetname] because it has no outputs.

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

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

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

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

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

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

最佳答案

使用虚拟输出怎么样?

<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 但没有找到,但指定一个特定文件不会进行搜索,因此并不关心它是否存在。

关于MSBuild:首次执行时目标输入和输出失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com