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

If Any of These Files Don't Exist Execute Target

本文关键字:不存在 执行 目标 任何一 文件 如果      更新时间:2023-10-16

我有一个Target,如果我的ItemGroup中没有任何文件,我想运行一次。

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

我的问题是在"?"中放什么。

您可以使用另一个Target来浏览文件列表(Targets擅长什么!)并在Property中留下结果。制作一个依赖于测试程序Target和Bar的包装器Target。Bar具有使用第一个目标设置的机制的条件。

请注意,在任务完成之前,不会看到任务中的全局属性集,因此习惯用法是将产生结果的事物和消耗结果的事物包装为空任务的从属对象。

我认为您还需要使测试程序成为Bar的依赖项,以确保它得到正确的顺序。

类似这样的东西:

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

触发TestLoop后,如果且仅当至少有一个文件存在时,测试的属性将设置为"存在"。也就是说,它编码一个循环逻辑OR。

现在,如果您将其用作依赖项:

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

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

哦,而Wrapper就是我们要找的目标。如上所述,如果你直接询问Bar,它不会看到属性更新(我认为)。因此,您可以命名它们,使Wrapper成为公开的Bar,而您的Bar成为内部Bar_helper。