如果我Target
的文件都不存在,我想运行一次ItemGroup
。
<ItemGroup>
<Foo Include="a.txt;b.txt;c.txt" />
</ItemGroup>
<Target Name="Bar" Condition="?">
我的问题是在“?”中放什么。
如果我Target
的文件都不存在,我想运行一次ItemGroup
。
<ItemGroup>
<Foo Include="a.txt;b.txt;c.txt" />
</ItemGroup>
<Target Name="Bar" Condition="?">
我的问题是在“?”中放什么。
您可以使用另一个目标来浏览文件列表(目标擅长什么!)并将结果留在属性中。制作一个依赖于测试器 Target 和 Bar 的包装器 Target。Bar 具有使用第一个目标设置的机制的条件。
请注意,在任务完成之前,不会看到任务中设置的全局属性,因此习惯用法是将产生结果的事物和使用结果的事物包装为空任务的依赖项。
我认为您还需要使测试器成为 Bar 的依赖项,以确保它的顺序正确。
像这样的东西:
<Target Name="TestLoop" Outputs="%(Foo.Identity)">
<PropertyGroup>
<Tested Condition="Exists(%(Foo.Identity))">Present</Tested>
</PropertyGroup>
</Target>
触发 TestLoop 后,当且仅当至少有一个文件存在时,Tested 属性才会设置为“Present”。也就是说,它对循环逻辑 OR 进行编码。
现在,如果您将其用作依赖项:
<Target Name="Wrapper" DependsOnTargets="TestLoop;Bar" />
然后你可以让 Bar 查看 TestLoop 留下的状态。假设它们以正确的顺序执行,而不是并行执行!为了确保这一点,还要使 TestLoop 成为 Bar 的先决条件,并且构建引擎将确定所需的顺序,并且知道在 TestLoop 完成之前不要尝试执行 Bar。
哦,Wrapper 是要求的目标。如上所述,如果您直接询问 Bar ,它不会看到属性更新(我认为)。因此,您可以将它们命名为使 Wrapper 成为暴露的 Bar,而您的 Bar 成为内部 Bar_helper。