Наша система компиляции копирует бинарные зависимости, используя robocopy
. Например, гипотетический файл copy_dependencies.bat
может выглядеть примерно так:
@echo off
robocopy %PARAMETERS% src_path\Debug dst_path\Debug dep_name.dll
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll
Поскольку такие двоичные файлы влияют не на успех компиляции, а на выполнение окончательных исполняемых файлов, мы хотели бы добавить к ним проверку ошибок (например, проверять изменения пути или имени файла). Идея состоит в том, чтобы поймать их как можно скорее, а не на более глубоком уровне во время выполнения тестов.
Так как если пакет возвращает ненулевой уровень ошибки, то наша система компиляции автоматически останавливается, нашим первым подходом будет проверка уровня ошибки в конце каждого пакета:
@echo off
robocopy %PARAMETERS% src_path\Debug dst_path\Debug dep_name.dll
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll
if errorlevel 8 exit /b
exit /b 0
Примечание. Мы проверяем уровень ошибки не ниже 8, поскольку меньшие значения являются для нас просто предупреждениями (лишние файлы и т. д.). Вот почему мы также сбрасываем уровень ошибки на 0
в конце.
Проблема в том, что robocopy
сбрасывает уровень ошибки, поэтому если первая команда не удалась, об этом не сообщается. Затем следующим решением будет проверка каждого отдельного вызова:
@echo off
robocopy %PARAMETERS% src_path\Debug dst_path\Debug dep_name.dll
if errorlevel 8 exit /b
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll
if errorlevel 8 exit /b
exit /b 0
Проблема здесь в том, что нам пришлось бы изменить сотни файлов.
В дополнение к скрипту replace-all-like есть ли какой-нибудь более чистый способ сделать это? Что-то вроде флага для robocopy, который мы можем добавить к PARAMETERS
, чтобы избежать сброса?
Другой подход может включать флаг выполнения для пакетов, который автоматически завершает работу скрипта, если уровень ошибки равен 8 или выше (поэтому мы можем установить его в начале компиляции).
ПС
Я публикую наше лучшее решение на данный момент, но оно все равно потребует изменения всех файлов. Изменение пакетных файлов (особенно из-за простого шаблона) сейчас не занимает много времени, но я хотел бы знать, есть ли решение, которое не требует таких изменений. Спасибо!
robocopy
нет флага, чтобы сохранить предыдущие значенияErrorLevel
. В любом случае, вы должны сначала уточнить, что вы хотите, чтобы произошло в случае сбоя первой строкиrobocopy
, поэтому следует ли выполнять вторую или нет... - person aschipfl   schedule 30.01.2018copy_dependendies.bat
терпит неудачу (уровень ошибки > 0), так как это тот, который проверяется компиляцией - person cbuchart   schedule 30.01.2018robocopy.exe
напрямую? - person aschipfl   schedule 30.01.2018