Устранение ошибок на этапах предварительной сборки в Visual Studio 2010

#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

http://ss64.com/nt/exit.html

Ответ №6:

Решит ли вашу проблему внедрение команды в исполняемый файл, который всегда возвращает 0?

в вызове c

 system("net stop myservice")