子目录中的MSBUILD任务项:这些不可能是增量构建吗?

时间:2008-10-09 16:06:25

标签: msbuild

我有一个简单的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>

我在这里做错了什么?

2 个答案:

答案 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”。