我有一个简单的Word to 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正确跳过该文件,因为它已经被转换)。如果我使用递归项目规范(上面的第三个),我会得到相同的行为(即,如果PDF已过期或丢失,One.doc只会被转换,但子目录中的所有文档总是会被转换,无论如何)。 / p>
我在这里做错了什么?
答案 0 :(得分:1)
我发现了问题。事实证明,我在Task中有一些逻辑可以将为PDF文件指定的任何相对路径转换为绝对路径。删除后,将脚本更改为:
<Target Name="Convert"
Inputs="@(WordDocuments)"
Outputs="@(WordDocuments->'%(RelativeDir)%(FileName).pdf')">
<DocToPdf Inputs="%(WordDocuments.Identity)"
Outputs="%(RelativeDir)%(FileName).pdf">
<Output TaskParameter="ConvertedFiles" ItemName="PdfDocuments" />
</DocToPdf>
</Target>
我得到了我期望的行为。
答案 1 :(得分:0)
这是我的一个任务示例,该任务对通过子目录递归发现的项执行增量构建:
<Target Name="Build" Inputs="@(RequestTextFiles)" Outputs="@(RequestTextFiles -> '%(Rootdir)%(Directory)%(Filename).out')">
<DoSomething SourceFiles="@(RequestTextFiles)" />
</Target>
这将1:1与输入文件和具有相同名称的输出文件进行映射,输出到具有不同扩展名的相同路径,在这种情况下为“out”。