MSBuild:目标输入和输出在第一次执行时失败

MSBuild:目标输入和输出在第一次执行时失败,msbuild,Msbuild,我尝试在MSBuild中执行一个生成目标。目标有一些输入和输出,我把它们放在那里,以加快中间构建的时间。输入文件总是存在(头文件),而输出文件并不总是存在(XML文件) 一个可能跳过任务的中间构建是非常可取的,因为它在性能方面非常昂贵 无论如何,如果输出已经存在,那么输入和输出工作得很好。在这种情况下,MSBuild会发出一条非常有用的消息,说明目标已跳过,因为所有文件都是最新的 当输出目录和文件不存在时(第一次运行此任务时),MSBuild将失败,并显示以下消息: 正在跳过目标[targetn

我尝试在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的非常有用的信息。

使用虚拟输出怎么样

<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的帮助。我是MsBuild的新手,希望能够动态生成解决方案文件。我注意到在下面的SO帖子中,你提到你有一个类似的解决方案。你能和我分享一下吗。谢谢