Элементы задач MSBUILD в подкаталогах: инкрементные сборки на них невозможны? - PullRequest
0 голосов
/ 09 октября 2008

У меня есть простой конвертер 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 устарел или отсутствует, но все документы в подкаталогах всегда конвертируются независимо).

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 09 октября 2008

Я нашел проблему. Оказывается, у меня была некоторая логика в Задаче, которая превращала бы любой относительный путь, указанный для файла 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 голосов
/ 11 октября 2008

Вот мой пример задачи, которая выполняет инкрементные сборки для элементов, обнаруженных рекурсивно через подкаталоги:

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

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

  </Target>

Это сопоставляет 1: 1 с входным файлом и выходным файлом с тем же именем, который выводит на тот же путь с другим расширением, а именно, в данном случае, «out».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...