Visual Studio и MSBuild по-разному запускают BeforeBuild в проекте WiX - PullRequest
8 голосов
/ 04 сентября 2010

У меня есть WiX (установщик Windows XML) v3, проект, который содержит ссылки на другие проекты в моем решении.Я использую задачу копирования внутри события BeforeBuild проекта WiX, чтобы собрать некоторые выходные данные ссылочных проектов для последующего использования моего Heat .

Когда я собираю проект WiX (нерешение) внутри Visual Studio каждый из упомянутых проектов создается перед моим проектом WiX, и после их создания происходит событие BeforeBuild в моем проекте WiX, а затем создается сам проект WiX.Такое поведение я ожидаю - я могу получить доступ к файлам из каталогов bin проектов ссылок в WiX BeforeBuild и использовать их по своему усмотрению до выполнения проекта WiX Candle .

Проблема, с которой я сталкиваюсь, заключается в том, что при создании файла WiX с помощью MSBuild я обнаружил, что событие BeforeBuild сразу запускается ПЕРЕД любым из указанных проектов.Это различие в поведении означает, что я не могу использовать выходные данные ссылочных проектов при сборке из командной строки.

Почему BeforeBuild выполняется в другой момент времени при запуске через MSBuild из командной строки внутрьVisual Studio?

1 Ответ

9 голосов
/ 04 сентября 2010

Если вы строите внутри Visual Studio, зависимости решения (которые могут быть явными или основаны на ссылках на проекты) используются для определения того, какие проекты необходимо построить, и для каждого из них создается отдельная сборка. Это необходимо, поскольку решения могут также содержать проекты, которые не построены с использованием MSBuild, а в других проектах в решении для них установлены явные зависимости. Побочным эффектом является то, что каждый проект рассматривается как отдельная сборка, что обеспечивает правильный BeforeBuild заказ для вас ..

Если вы строите из командной строки с использованием MSBuild, зависимые проекты разрешаются (и при необходимости создаются) во время цели ResolveReferences. Цель BeforeBuild и событие PreBuild (выполняемые из цели PreBuildEvent) выполняются до цели ResolveReferences. Таким образом, цель зависимого проекта BeforeBuild заканчивается выполнением до того, как начнется сборка для проекта зависимости.

Обратите внимание, что с точки зрения отдельного проекта, цель BeforeBuild имеет смысл выполнить перед разрешением зависимостей, поскольку разрешение зависимости может зависеть от вывода цели BeforeBuild. Например, BeforeBuild может выполнить пользовательский сценарий для получения последней копии любых зависимых проектов из SCM .

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