代码之家  ›  专栏  ›  技术社区  ›  lesscode

子目录中的MSBUILD任务项:是否无法对其进行增量生成?

  •  0
  • lesscode  · 技术社区  · 16 年前

    我有一个简单的Word到Pdf转换器作为MSBuild任务。该任务将Word文件(ITaskItems)作为输入,Pdf文件(ITakItems)作为输出。该脚本使用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过期或丢失时才会被转换,但子目录中的所有文档总是会被转换)。

    我在这里做错了什么?

    2 回复  |  直到 16 年前
        1
  •  2
  •   lesscode    16 年前

    我发现了问题。事实证明,我在任务中有一些逻辑,可以将为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>
    

    我得到了我所期望的行为。

        2
  •  0
  •   Adam    16 年前

    这是我的一个任务示例,它对通过子目录递归找到的项目执行增量构建:

      <Target Name="Build" Inputs="@(RequestTextFiles)" Outputs="@(RequestTextFiles -> '%(Rootdir)%(Directory)%(Filename).out')">
    
        <DoSomething SourceFiles="@(RequestTextFiles)" />
    
      </Target>
    

    这将以1:1的比例映射一个输入文件和一个同名输出文件,输出到具有不同扩展名的同一路径,在本例中为“out”。