我有一个简单的 Word 到 Pdf 转换器作为 MSBuild 任务。该任务将 Word 文件 (ITaskItems) 作为输入,将 Pdf 文件 (ITaskItems) 作为输出。该脚本使用 Target 转换进行转换:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<UsingTask AssemblyFile="$(MSBuildExtensionsPath)\MyTasks.dll" TaskName="MyTasks.DocToPdf" />
<Target Name="Build" DependsOnTargets="Convert" />
<Target Name="Convert"
Inputs="@(WordDocuments)"
Outputs="@(WordDocuments->'%(FileName).pdf')">
<DocToPdf Inputs="@(WordDocuments)"
Outputs="%(FileName).pdf">
<Output TaskParameter="ConvertedFiles" ItemName="PdfDocuments" />
</DocToPdf>
</Target>
<ItemGroup>
<WordDocuments Include="One.doc" />
<WordDocuments Include="SubDir\Two.doc" />
<WordDocuments Include="**\*.doc" />
</ItemGroup>
</Project>
发生的事情是 SubDir\Two.doc 在每次增量构建时都会被转换,而 One.doc 不会(即 MSBuild 正确跳过该文件,因为它已经被转换)。如果我使用递归项目规范(上面的第三个),我会得到相同的行为(即 One.doc 只有在 PDF 过期或丢失时才会被转换,但子目录中的所有文档总是会被转换)。
我在这里做错了什么?