у меня есть Target
который я хочу запустить один раз, если ни один из файлов в моем ItemGroup
существовать.
<ItemGroup>
<Foo Include="a.txt;b.txt;c.txt" />
</ItemGroup>
<Target Name="Bar" Condition="?">
Мой вопрос в том, что нужно вставить в «?».
Вы можете использовать другую цель, чтобы просмотреть список файлов (какие цели хороши!) И оставить результат в свойстве. Создайте обёртку Target, которая зависит от цели тестера и Bar. Бар имеет условие, которое использует механизм, установленный первой целью.
Обратите внимание, что глобальный набор свойств внутри задачи не виден до тех пор, пока эта задача не будет завершена, поэтому идиома заключается в том, чтобы обернуть объект, производящий результат, и объект, потребляющий результат, в зависимости от пустой задачи.
Я думаю, что вы должны также сделать тестера зависимым от Бар, чтобы убедиться, что он получает правильный порядок.
Что-то вроде этого:
<Target Name="TestLoop" Outputs="%(Foo.Identity)">
<PropertyGroup>
<Tested Condition="Exists(%(Foo.Identity))">Present</Tested>
</PropertyGroup>
</Target>
После запуска TestLoop для свойства Test будет установлено значение «Present», если и только если присутствует хотя бы один из файлов. То есть он кодирует циклическое логическое ИЛИ.
Теперь, если вы используете это как зависимость:
<Target Name="Wrapper" DependsOnTargets="TestLoop;Bar" />
тогда вы можете сделать так, чтобы Bar посмотрел на состояние, оставленное TestLoop.
Предполагая, что они выполняются в правильном порядке, а не параллельно! Чтобы убедиться в этом, также сделайте TestLoop обязательным условием для Bar, и механизм сборки определит необходимую последовательность и будет знать, что не следует пытаться выполнять Bar до завершения TestLoop.
О, и Wrapper — цель, о которой нужно просить. Как описано выше, если вы запросите Bar напрямую, он не увидит обновление свойства (я думаю). Таким образом, вы можете назвать их, чтобы сделать Обертку открытым Баром, а ваш Бар — внутренним Помощником.