#visual-studio #visual-studio-2010 #prebuild #pre-build-event
#visual-studio #visual-studio-2010 #предварительная сборка #предварительная сборка-событие
Вопрос:
В моем решении есть несколько проектов, одним из которых является служба Windows; у меня есть шаг предварительной сборки, чтобы остановить службу, и шаг последующей сборки, чтобы перезапустить ее (таким образом, EXE-файл службы Windows не блокируется, когда VS создает / перезаписывает его).
on pre-build:
net stop myservice
on post-build:
net start myservice
Если служба не запущена во время запуска сборки, команда net stop завершается ошибкой, и это не позволяет продолжить сборку.
Что я могу сделать, чтобы принудительно выполнить сборку, даже если этап предварительной сборки завершился неудачно?
Ответ №1:
Я понял это — вам просто нужно добавить следующее утверждение в конце:
SET ERRORLEVEL = 0
или просто:
EXIT 0
Комментарии:
1. Я должен удалить пробелы, чтобы заставить первый работать:
SET ERRORLEVEL=0
Ответ №2:
Я знаю, что это старый пост, но недавно у меня тоже возникла эта проблема. Я хотел завершить процесс, который я создавал, если он был запущен в данный момент, и обнаружил, что могу сделать:
taskkill /f /im $ (TargetName).exe 2> nul 1>nul Выход 0
2>nul 1>nul
без Exit 0
или наоборот, похоже, не работает. Я должен сделать оба.
Также стоит отметить, что это связано с использованием Visual Studio Express 2012.
Я нашел решение при изучении этой проблемы, а также в этом блоге
2> nul 1> nul проглотит stderr и stdout из команды. ВЫХОД 0 гарантирует, что событие сборки вернет 0.
Комментарии:
1. Это именно то, что я пытался сделать. Еще одна информация: я обнаружил, что
EXIT 0
в пакетном файле, вызываемом из действия сборки VS2015 с помощьюCALL myscript.bat
, все действие завершается вместо продолжения послеmyscript.bat
. Но это исправлено с помощьюSET ERRORLEVEL = 0
вместо этого.2. или лучше просто
2>nul amp;set errorlevel=0
Это позволит вам добавить дополнительные строки позже. Нет необходимости перенаправлять стандартный вывод1> nul
3. Работает и в VS2017
4. Работает и в VS2019
Ответ №3:
Нет необходимости переопределять стандартный вывод, просто stderr. Кроме того, set errorlevel
позволяет вам создавать дополнительные строки позже, если вам нужно. Выход завершится немедленно.
taskkill /f /im:$(TargetFileName) 2>nul amp;set errorlevel=0
Работает в VS 2017.
Ответ №4:
Немного запоздалое, но хорошее решение, поэтому я все равно поделюсь им.
Следующее решение было взято из этого сообщения в блоге.
Вы просто определяете свои, например, шаги после сборки по мере необходимости. Вам не нужно переносить их в командный файл, но вы могли бы. Затем вы изменяете свой файл проекта (например, файл vbproj или csproj) и вставляете следующий фрагмент непосредственно перед тегом закрытия проекта:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>
Это изменяет способ выполнения Visual Studio шагов после сборки. Атрибуты ContinueOnError предписывают VS просто игнорировать ошибки. Он по-прежнему выдает предупреждения в результатах сборки, но это не останавливает сборку.
Вы можете сделать то же самое для PreBuildEvent, соответствующим образом изменив приведенный выше фрагмент.
Конечно, это работает только для всех этапов сборки в полном объеме. Вы не можете выборочно игнорировать ошибки только на определенных шагах. Если вам нужно это сделать, вы должны придерживаться решения с помощью пакетного файла, но самое приятное в приведенном выше решении то, что вам не нужен отдельный пакет.
Sascha
Ответ №5:
Оберните свои net
команды в пакетный файл и используйте exit /B 0
Ответ №6:
Решит ли вашу проблему внедрение команды в исполняемый файл, который всегда возвращает 0?
в вызове c
system("net stop myservice")