您已经提出了具体的子问题以实现您的总体目标,我想您想了解 MSBuild,而不是对您的整体任务获得死记硬背的答案(由于您的赏金),所以我将回答您的个人问题,然后尝试将它们全部汇总到一个解决方案中。
因此,假设您要将所有 .jpg 文件转换为 .png。
根据扩展名从内容项列表中创建子列表:
<ItemGroup>
<Sublist Include="@(Content)" Condition=" '%(Extension)' == '.jpg' " />
</ItemGroup>
接收任务中项目的路径。
两种方式 - 取决于您的任务可以接受的输入。这种方式就像对子列表中每个项目的“foreach”,我倾向于将它与 Exec 任务一起使用:
<Exec Command="convert.exe /Input:%(Sublist.FullPath)" />
指定输出路径还取决于 .exe 或您的任务以及输出路径对特定任务的意义:
它是一个目录,还是只是一个具有不同扩展名的文件名。但我假设您要输出具有相同名称但扩展名不同的文件:
<Exec Command="convert.exe "%(Sublist.FullPath)" "%(Sublist.RootDir)%(Sublist.Directory)%(Sublist.Filename).png"" />
如果 jpg 更改(或已清理),如何重建 png。
好吧,这是使用包含目标元素的 Inputs 和 Outputs 属性,我们的转换命令在其中执行。输入指定源文件是什么,输出指定目标将产生什么。MSBuild 然后将输入的日期时间与输出的日期时间进行比较,如果它们已过期,则重新构建输出
<Target Name="ConvertJpg"
Inputs="@(Content)"
Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).png' )"
Condition=" '%(Extension)' == '.jpg' "
- 输入说我们要使用“内容”项目组
- Condition 属性确保我们只使用以 .jpg 扩展名结尾的内容项
- Outputs 属性表示我们正在使用的输入中,我们将生成具有相似路径和文件名但以 .png 扩展名结尾的文件
最后,您正确地发现您需要将生成的 .png 文件重新注入到 @Content 项组中——嗯,这很简单,您只需将它们包含到 Content 项中。回想一下,子列表包含 .jpg 文件——我们想要这些文件,但以 .png 结尾。一旦生成了 png,我们也不希望内容项组中的 .jpg 文件
<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...