Панель вывода Visual Studio 2010 не обновляет вывод после сборки - PullRequest
4 голосов
/ 27 сентября 2010

Я недавно обновился с VS2008 до VS2010. Поскольку я выполняю много удаленной отладки (через VPN), я использую события Post-Build для копирования скомпилированных двоичных файлов и PDB на целевой компьютер перед запуском. Я делаю это, вызывая командный файл, который (помимо прочего) выполняет Robocopy.

В VS2008 панель «Вывод» будет отображать вывод Robocopy в режиме реального времени, т. Е .:

5>          Newer             421376    RadarController.pdb
5>    0%  
5>   14%  
5>   29%  
5>   43%  
5>   58%  
5>   72%  
...

Однако в VS2010 вместо того, чтобы постепенно показывать прогресс события после сборки, он просто блокируется до тех пор, пока не завершится все событие - тогда выводится все сразу. Это особая проблема при копировании через медленное сетевое соединение, поскольку я понятия не имею, что происходит в течение потенциально минут за раз. Нет никакого способа угадать, будет ли копия продолжаться в течение 5 секунд или 5 минут; Я бы даже не знал, что это копирование, если бы я не был уже знаком с порядком событий компилятора.

Это известная ошибка в 2010 году, или кто-нибудь знает о существующем обходном пути?

Спасибо!

Редактировать 1: проект на C #.

Редактировать 2: Точная команда Robocopy, которую я использую: robocopy.exe . \\192.168.5.7\Release /NJS /NJH /Z /W:1 /R:5 /E

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Учитывая, что, похоже, MS не хочет скоро исправлять эту проблему, и мы все еще хотим перейти к VS.NET 2010, мы разработали следующий обходной путь. Это не идеально, но достаточно хорошо для нас.

Большинство наших длительных событий после сборки мы запускаем только при сборке для релиза, а не при обычной разработке программного обеспечения. Поэтому в этих случаях мы запускаем эти события во внешнем командном окне, чтобы мы могли отслеживать ход выполнения.

Мы используем команду unix tee (где-то схваченную в сети), чтобы добавить вывод в окно вывода после завершения скрипта.

В событии после сборки у нас есть:

@@echo off
cd "$(ProjectDir)"
START /WAIT cmd /c PostBuildStub.cmd "$(SolutionDir)" "$(ProjectDir)" "$(TargetDir)" "$(SolutionPath)" "$(ConfigurationName)" 
ECHO PostBuild output:
TYPE $(TargetDir)postbuildlog.txt
ECHO Done.

Таким образом, событие postbuild запускает внешнее окно cmd и по окончании выдает файл журнала в окно вывода.

PostBuildStub.cmd выглядит так:

@echo off
echo.

set SolutionDir=%~1
set ProjectDir=%~2
set TargetDir=%~3
set SolutionFile=%~4
set ConfigurationName=%~5

CD /D "%ProjectDir%"

CALL PostBuild.cmd %1 %2 %3 %4 %5 | "%SolutionDir%\bin\tee.exe" "%TargetDir%\postbuildlog.txt"

if errorlevel 1 exit 1

Заглушка postbuild создает файл журнала, вызывая реальные команды postbuild и передавая выходные данные как в окно cmd, так и в файл журнала.

Затем в PostBuild.cmd у нас есть старые добрые команды postbuild, которые выполняют компиляцию ресурсов, погружение в воду, запутывание, подписывание или все, что вам нужно:

1 голос
/ 07 июля 2011

Мне интересно, решит ли это проблему с помощью задачи msbuild <exec> вместо события после сборки?

Если задача <exec> не соответствует вашим требованиям, возможно, пользовательская задача msbuild, выполняющая что-то похожее на задачу <exec>, решит проблему, например.

Обновление:
Я только что попытался использовать <Exec Command="" /> вместо события PostBuild в моем файле msbuild, но оно по-прежнему оставляло среду IDE Visual Studio занятой \ не отвечающей.

Возможно, мы можем создать пользовательскую задачу msbuild,вызывает Application.DoEvents для поддержки отзывчивости пользовательского интерфейса?

Обновление № 2 : я загрузил исправление в пакет расширений MSBuild, в котором реализована пользовательская задача msbuild под названием SmartExec, которая решает эту проблему.

http://msbuildextensionpack.codeplex.com/workitem/9053
http://msbuildextensionpack.codeplex.com/SourceControl/list/patches
Код исправления 9878

1 голос
/ 15 октября 2010

Для меня это одно и то же.У меня есть шаг после сборки, который состоит из ILMerge и затем команды перемещения DOS.Вывод ILMerge никогда не показывается, но вывод от move.Я отправил сообщение об ошибке http://connect.microsoft.com, ID 613727 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...