Вы задали конкретные подвопросы с целью достижения своей общей цели. Я полагаю, что вы хотите узнать о MSBuild, а не получить подробный ответ на вашу общую задачу (что вы получите от многих других людей) из-за вашей щедрости), поэтому я отвечу на ваши индивидуальные вопросы, а затем попытаюсь свернуть их все в решение.
Допустим, вы хотите конвертировать все файлы .jpg в .png.
Создать подсписок из списка элементов контента на основе расширения:
<ItemGroup>
<Sublist Include="@(Content)" Condition=" '%(Extension)' == '.jpg' " />
</ItemGroup>
Получить путь к предмету в задании.
Два способа - зависит от ввода, который может принять ваша задача. Этот способ похож на foreach для каждого элемента в Sublist, и я бы предпочел использовать его с задачей Exec:
<Exec Command="convert.exe /Input:%(Sublist.FullPath)" />
Указание выходного пути также зависит от .exe или задачи, которую вы выполняете, и что означает выходной путь для конкретной задачи:
это каталог или просто имя файла с другим расширением. Но я предполагаю, что вы хотите вывести файлы с тем же именем, но с другим расширением:
<Exec Command="convert.exe "%(Sublist.FullPath)" "%(Sublist.RootDir)%(Sublist.Directory)%(Sublist.Filename).png"" />
Как перестроить png, если jpg изменяется (или очищается).
Ну, это использует атрибут Inputs и Outputs содержащего целевой элемент, где выполняется наша команда convert. Inputs указывает, что представляют собой исходные файлы, а output указывает, что будет производить цель. Затем MSBuild сравнивает дату и время входов с датой и временем выходных данных, и если они устарели, то выходные данные перестраиваются
<Target Name="ConvertJpg"
Inputs="@(Content)"
Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).png' )"
Condition=" '%(Extension)' == '.jpg' "
- Входные данные говорят, что мы хотим использовать группу элементов "Контент"
- Атрибут Condition гарантирует, что мы работаем только с элементами контента, заканчивающимися расширением .jpg
- Атрибут Outputs говорит, что из входов, с которыми мы работаем, мы будем генерировать файлы с одинаковым путем и именем файла, но заканчивающиеся расширением .png
Наконец, вы правильно заметили, что вам нужно повторно внедрить сгенерированные файлы .png обратно в группу элементов @Content - ну, это просто, вы просто включаете их в элемент контента. Напомним, что Sublist содержит файлы .jpg - нам нужны эти файлы, но с окончанием .png. Мы также НЕ хотим, чтобы файлы .jpg в группе элементов содержимого были созданы после создания png
<Content Remove="@(Sublist)" />
<Content Include="@(Sublist -> '%(RootDir)%(Directory)%(Filename).png' )" />
Итак, подытожив, ваша цель будет выглядеть примерно так:
<Target Name="ConvertJpg"
Inputs="@(Content)"
Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).png' )"
Condition=" '%(Extension)' == '.jpg' "
<ItemGroup>
<Sublist Include="@(Content)" Condition=" '%(Extension)' == '.jpg' " />
</ItemGroup>
<Exec Command="convert.exe /Input:%(Sublist.FullPath) Output=%(Sublist.RootDir)%(Sublist.Directory)%(Sublist.Filename).png" />
<Content Remove="@(Sublist)" />
<Content Include="@(Sublist -> '%(RootDir)%(Directory)%(Filename).png' )" />
</Target>
Кстати, в ImageMagik есть инструмент командной строки, который преобразует jpg в png ...