Несколько предварительных событий в Visual Studio?
Я следил за записью в блоге Скоттом Хансельманом для управления конфигурацией с событиями PreBuild и отлично работает.
Теперь я хочу разделить мою конфигурацию на несколько разных файлов, поэтому перед сборкой нужно снова выполнить команду. Проблема заключается в том, что текст события PreBuild запускается как одна консольная команда. Как я могу разделить его на несколько команд?
Ответы
Ответ 1
Выясняется проблема: пример Скотта не включает команду call
в начале строки. Это прекрасно, если вы не хотите выполнять файл .bat
несколько раз с разными параметрами.
Это:
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)connectionStrings.config.$(ConfigurationName)" "$(ProjectDir)connectionStrings.config"
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appSettings.config.$(ConfigurationName)" "$(ProjectDir)appSettings.config"
работал отлично для меня.
Ответ 2
Я использую Visual Studio 2010 в 64-разрядных версиях Windows 7.
Я нашел решение, которое мне по душе, я объединяю команды вместе с && ^
, например, редактируя файл .vcxproj xml следующим образом:
<PreBuildEvent>
<Command>echo "hello 1" && ^
echo "hello 2" && ^
echo "hello 3"</Command>
<Message>Performaing pre-build actions ...</Message>
</PreBuildEvent>
Я связал три команды вместе. "& &" сообщает оболочке прекратить выполнение, если предыдущая ошибка команды отсутствует.
Обратите внимание: в XML файле нельзя использовать &&
напрямую, поэтому '& & '. Также обратите внимание на использование символа ^
, это символ продолжения строки оболочки CMD (например, BASH \
char).
Каждая новая команда должна начинаться в начале строки. Используя этот подход, можно объединить столько команд, сколько захотите, но если какой-либо сбой, остальные в цепочке не будут выполнены.
Здесь мой фактический usecase, я выполняю некоторые проверки среды с помощью Python script, а затем копирует свой предварительно скомпилированный файл отладки заголовков в другой каталог подпроектов:
<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
в команде копирования предотвращает появление любого результата в окне сборки, поэтому мои товарищи по команде не будут волноваться, когда говорят 0 file(s) copied.
Ссылка на совместное использование предварительно скомпилированных заголовков между подпроектами:
Совместное использование предварительно скомпилированных заголовков между проектами в Visual Studio
Ответ 3
Вы должны иметь возможность помещать команды в отдельную строку, а затем каждая команда будет выполняться последовательно. В качестве альтернативы, способ "читера" сделать то же самое:
- Создайте второй командный файл, который запускает требуемую часть новых функций, затем создайте родительскую партию, которая запускает два командных файла компонента, и запустите эту новую партию в событии предварительной сборки. Например: batch1.bat изменяет файл 1, batch2.bat изменяет файл 2, затем batch3.bat запускает как batch1.bat, так и batch2.bat