Как заставить MSBuild не строить цель частично? - PullRequest
0 голосов
/ 22 мая 2009

У меня есть процесс сборки, который делает следующее:

  1. Запускает TLBIMP для ряда (скажем, 10) COM-библиотек COM (именованная группа TaskItems). Это моя цель «Импорт», которая использует задачу Exec.
  2. Запускает ILDASM на 10 сборках взаимодействия. Это моя цель «Разобрать», которая использует задачу Exec.
  3. Запускает пользовательскую задачу, чтобы одновременно взять все 10 файлов IL и выполнить с ними некоторую работу (подробности не важны, но крайне важно, чтобы ВСЕ 10 файлов IL обрабатывались вместе этой задачей). Это моя цель "Работа".
  4. Сборка 10 файлов IL с использованием ILASM обратно в 10 библиотек DLL. Это моя цель «Собрать», использует задачу Exec.
  5. Запускает ILMerge для объединения 10 сборок в одну. Это моя цель "Объединить", использует задачу Exec.

Все хорошо, когда я делаю чистую перестройку. Когда я делаю инкрементную сборку, и только некоторые из исходных COM-DLL изменились, MSBuild совершенно корректно выполняет только частичные сборки соответствующих целей для выходов, которые фактически устарели по отношению к своим входам.

Есть ли способ, которым я могу "заставить" MSBuild только для одной цели (шаг 3 выше), чтобы выполнить Задачу, пропуская ВСЕ входные данные вместо только устаревших? Я не хочу изменять код моей пользовательской задачи для жесткого кодирования имен файлов, я бы хотел, чтобы они предоставлялись в виде TaskItems из скрипта MSBuild, но моей пользовательской задаче должны быть предоставлены ВСЕ входные данные, полученные из исходная группа COM-библиотек TaskItem, а не только те, которые были перестроены с помощью этой конкретной сборки.

Ответы [ 2 ]

0 голосов
/ 22 мая 2009

Вы, кажется, находитесь на правильном пути, касаясь файлов перед выполнением вашей цели. Поскольку входные файлы были изменены (на ваше прикосновение) совсем недавно, тогда все выходные данные цели полностью перестраиваются. Другой подход, который вы можете сделать, - это создать цель, то есть CleanIntFiles , которая будет удалять эти файлы. Затем вы можете поместить эту цель в свойство BeforeBuildDependsOn .

Дополнительную информацию о расширении этого свойства смотрите в моей статье Внутри MSBuild .

Сайед Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build

0 голосов
/ 22 мая 2009

Я думаю, что нашел способ. Я могу определить группу таким образом:

  <ItemGroup>
    <PrelimIL Include="$(IntermediateOutputPath)intermediate\*.il"/>
  </ItemGroup>

А затем в моей цели "Разобрать" есть второе задание:

<Touch Files="@(PrelimIL)" />
...