Наследовать событие после сборки в Visual Studio?

У меня есть решение в Visual Studio, в котором у меня есть общий лист свойств, содержащий команду события после сборки (bar), которую необходимо выполнять для каждого проекта.

Foo.props > Общие свойства > События сборки > Событие после сборки > Командная строка = bar

Как мне тогда указать дополнительные события после сборки для конкретного проекта? Обычное «Наследовать от родительских или проектных значений по умолчанию» отсутствует, и я бы предпочел не добавлять вручную bar в каждый отдельный проект, поскольку это затрудняет его обслуживание.


person JBentley    schedule 05.03.2013    source источник


Ответы (3)


На основании этого post, это кажется невозможным. Вы разместили свой вопрос некоторое время назад; Вам удалось найти реальную альтернативу?


Отредактировано после обратной связи: потенциально грязной альтернативой было бы определить вашу команду как макрос:

<!-- CommandX.props -->
<PropertyGroup>
  <CommandX>bar</CommandX>
</PropertyGroup>

Затем вы можете добавить $(CommandX) к команде пост-сборки проекта или к другому листу свойств. Если $(CommandX) не существует, он спокойно игнорируется.

Если вы добавите этот макрос в другой лист свойств, вам придется Import CommandX лист свойств $(CommandX) унаследовать значение:

<!-- Some-Other-Property-Sheet.props -->
<ImportGroup Label="PropertySheets">
  <Import Project="CommandX.props" />
</ImportGroup>

Узнав немного больше о процессе сборки, я хотел бы порекомендовать использовать задачи MSBuild. ; в частности, задача Exec может предложить наиболее подходящее решение.

person Pooven    schedule 09.12.2013
comment
Нет, я прибегал к ручному обслуживанию каждого проекта отдельно, согласно моему вопросу. Единственное решение, о котором я думал (но не пытался реализовать), - это разработка моей собственной структуры наследования с помощью скриптов - пусть каждый проект вызывает тот же скрипт, что и его событие после сборки, но передает имя проекта как переменную и имеет скрипт запустите дополнительные команды по мере необходимости. Неуклюжий, но, по крайней мере, он сокращает обслуживание до одного файла. - person JBentley; 09.12.2013
comment
В качестве альтернативы, пусть каждый проект вызывает свой собственный сценарий (используя встроенные макросы MSVC для вызова сценария из местоположения, зависящего от проекта), и пусть сценарии рекурсивно вызывают сценарии из проектов, от которых они наследуются. Основная проблема с обоими этими подходами заключается в том, что сама структура наследования должна обновляться в двух местах (листы свойств и скрипты), иначе они не синхронизируются. - person JBentley; 09.12.2013

Найдя это решение и посмотрев на другой пост. Я обнаружил, что не могу понять, почему команда VC++ отказалась от этой функции.

После просмотра макросов для страниц свойств вы можете включить команду из предыдущих свойств, используя макрос %(Command) / переменную среды. Это работает для всех событий сборки.

PropertySheet1.props

copy some.dll $(OutputPath)
%(Command)

PropertySheet2.props

copy other.dll $(OutputPath)
%(Command)

В результате выполняются все команды.

person discomurray    schedule 30.03.2014

Поскольку некоторые события после сборки не наследуются от листа свойств, в котором они определены, я задал вопрос утке и приземлился здесь.

У меня есть хорошие новости: начиная с Visual Studio 2013, в командных строках событий Pre-Build и Post-Build есть параметр «Наследовать от родительских или проектных значений по умолчанию», который добавляет все события из листов свойств.

(Протестировано с Visual Studio 2013 и 2017 Professional)

person Yamakuzure    schedule 14.11.2017
comment
Это приятно, но не решает проблему. Как только вы добавите в свой проект пользовательское событие после сборки, оно заменит унаследованное значение. Ваш пользовательский шаг после сборки выполняется вместо унаследованного. Первоначальный вопрос заключался в том, как запустить пользовательский шаг после сборки в дополнение к унаследованному. - person foo64; 01.09.2018
comment
Извините, я отреагировал на обычное наследование от родительских или проектных значений по умолчанию отсутствует. - person Yamakuzure; 06.09.2018