如果这些文件中的任何一个不存在执行目标

时间:2014-11-11 14:15:06

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

如果Target中没有任何文件存在,我想要运行一次ItemGroup

<ItemGroup>
    <Foo Include="a.txt;b.txt;c.txt" />
</ItemGroup>
<Target Name="Bar" Condition="?">

我的问题是什么是放在'?'中的内容。

1 个答案:

答案 0 :(得分:1)

您可以使用另一个目标来浏览文件列表(目标擅长的目标!)并将结果保留在属性中。制作一个包装器Target,它依赖于测试器Target和Bar。 Bar具有使用第一个目标设置的机制的条件。

请注意,在该任务完成之前,不会看到任务中设置的全局属性,因此成语是将生成结果的事物和消耗结果的事物包装为空任务的依赖项。

我认为您还需要让测试人员成为Bar的依赖项,以确保它能使订单正确。

这样的事情:

<Target Name="TestLoop" Outputs="%(Foo.Identity)">
    <PropertyGroup>
        <Tested Condition="Exists(%(Foo.Identity))">Present</Tested>
    </PropertyGroup>
</Target>

触发TestLoop后,Property Tested将设置为&#34; Present&#34;当且仅当至少有一个文件存在时。也就是说,它编码循环逻辑OR。

现在,如果您将此作为依赖项使用:

<Target Name="Wrapper" DependsOnTargets="TestLoop;Bar" />

然后你可以让Bar看看TestLoop留下的状态。 假设它们以正确的顺序执行,而不是并行执行!为了确保这一点,还要使TestLoop成为Bar的先决条件,并且构建引擎将确定所需的序列,并且知道在TestLoop完成之后不要尝试执行Bar。

哦,Wrapper是要求的目标。如上所述,如果您直接询问Bar,它将不会看到属性更新(我认为)。因此,您可以将它们命名为将Wrapper设置为暴露的Bar,将Bar设置为内部Bar_helper。