Несколько событий предварительной сборки в Visual Studio?
Я проследил за публикацией в блоге Скотта Хансельмана (Scott Hanselman) для управления настройкой с помощью PreBuild Events, и он работает отлично
Теперь я хочу разделить свою конфигурацию на пару разных файлов, поэтому перед сборкой нужно снова выполнить команду. Проблема в том, что текст события PreBuild выполняется как одна консольная команда. Как я могу разделить его на несколько команд?
3 ответа
Оказывается, проблема в том, что пример Скотта не включает call
Команда в начале строки. Это хорошо, если вы не хотите выполнять .bat
файл несколько раз с разными параметрами.
Это:
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)connectionStrings.config.$(ConfigurationName)" "$(ProjectDir)connectionStrings.config"
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appSettings.config.$(ConfigurationName)" "$(ProjectDir)appSettings.config"
работал нормально для меня.
Я использую Visual Studio 2010 на Windows 7 64-разрядных.
Я нашел решение, которое лучше мне по вкусу, я объединяю команды вместе с && ^
Например, редактирование моего XML-файла.vcxproj примерно так:
<PreBuildEvent>
<Command>echo "hello 1" && ^
echo "hello 2" && ^
echo "hello 3"</Command>
<Message>Performaing pre-build actions ...</Message>
</PreBuildEvent>
Я связал три команды вместе. '&&' указывает оболочке прекратить выполнение в случае ошибки предыдущей команды.
Обратите внимание, что в XML-файле нельзя использовать &&
напрямую, поэтому & amp;& amp; должен быть использован вместо Также обратите внимание на использование ^
символ, это символ продолжения строки командной оболочки (как BASH \
голец).
Каждая новая команда должна начинаться с начала строки. Используя этот подход, можно связать столько команд, сколько нужно, но если произойдет сбой, остальные в цепочке не будут выполнены.
Вот мой реальный пример использования: я выполняю некоторые проверки среды с помощью скрипта Python, после чего копирую файл отладки моего предварительно скомпилированного заголовка в каталог другого подпроекта:
<PreBuildEvent>
<Command>C:\Python27\python.exe "$(SolutionDir)check_path.py" 32 && ^
copy "$(SolutionDir)h1ksim_lib\vc$(PlatformToolsetVersion).pdb" "$(IntDir)" /-Y > nul</Command>
<Message>Performaing pre-build actions ...</Message>
</PreBuildEvent>
> nul
использование команды copy предотвращает появление какого-либо вывода в окне сборки, поэтому мои товарищи по команде не пугаются 0 file(s) copied.
Ссылка на разделение предварительно скомпилированных заголовков между подпроектами здесь:
Совместное использование предварительно скомпилированных заголовков между проектами в Visual Studio
Вы должны быть в состоянии поместить команды в отдельной строке, и тогда каждая команда будет выполняться последовательно. В качестве альтернативы, "обманщик" способ сделать то же самое заключается в следующем:
- Создайте второй пакетный файл, который запускает требуемую часть новой функциональности, затем создайте родительский пакет, который запускает два пакетных файла компонента, и запустите этот новый пакет в событии перед сборкой. Например: batch1.bat изменяет файл 1, batch2.bat изменяет файл 2, затем batch3.bat запускает как batch1.bat, так и batch2.bat.