2008-10-09 34 views
0

我有一个简单的Word到PDF转换器作为MSBuild任务。该任务将Word文件(ITaskItems)作为输入,并将Pdf文件(ITaskItems)作为输出。该脚本使用对象的变换转换:子目录中的MSBUILD任务项目:这些增量构建是不可能的?

<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> 

发生了什么事是子目录\ Two.doc被转换在每个增量生成,One.doc不(即正确的MSBuild跳过该文件,因为它已经被转换) 。如果我使用递归项规范(上面的第三个),我会得到相同的行为(即,如果PDF已过期或丢失,One.doc只能被转换,但子目录中的所有文档始终都会被转换)。

我在这里做错了什么?

回答

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> 

我得到了我期望的行为。

0

这是我的一个任务,例如执行增量构建上项目递归发现通过子目录:

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

    <DoSomething SourceFiles="@(RequestTextFiles)" /> 

    </Target> 

这1映射:1输入文件,并且具有相同名称的输出文件,输出到具有不同扩展名的相同路径,即在这种情况下为'out'。

相关问题