Visual Studio 2010输出面板未更新后构建输出

5

我最近将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

1
我们正在遇到同样的问题。到目前为止,我在Connect上找到了这两个描述它的问题,但不幸的是微软没有回复它们——也许如果我们再投一些票,他们会回应:https://connect.microsoft.com/VisualStudio/feedback/details/566899/和https://connect.microsoft.com/VisualStudio/feedback/details/593873/ - Tuinstoelen
1
我在 connect 上发现了一个问题,描述如下:看起来他们不打算修复它... Url: https://connect.microsoft.com/VisualStudio/feedback/details/561075/build-window-hangs-on-long-post-build-event - Tuinstoelen
好的发现 - 我投了两票,并添加到“用户可以重现此错误”。看来我别无选择,只能坚持使用2008了...很遗憾他们选择忽视它 :( - J23
3个回答

2

考虑到似乎微软不想快速修复这个问题,而我们仍然希望前进到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 stub会调用真正的postbuild命令并将输出同时发送到cmd窗口和日志文件中,从而创建日志文件。

然后,在PostBuild.cmd中,我们有我们熟悉的postbuild命令,用于资源编译、il合并、混淆、签名或其他你需要的操作 :)


很棒,不错的解决方法 :) 不过我个人认为我会继续使用2008。 如果他们甚至都不能费心提供合理的修复程序,我并不特别想花费超过500美元进行“升级”。 - J23
这个解决方法对我不起作用,它仍然会在PostBuild事件期间使Visual Studio IDE忙碌/无响应。 :( - Rami A.
Rami:没错 - 在脚本运行期间,Visual Studio IDE会被阻塞,但至少现在你可以看到你的脚本进展情况了。 - Tuinstoelen

1

对我来说,它基本上做了同样的事情。我有一个后构建步骤,包括ILMerge和DOS移动命令。ILMerge输出从未显示过,但移动的输出是可见的。我在http://connect.microsoft.com上提交了一个错误,ID为613727


1

我在想,使用msbuild的<exec>任务而不是后期构建事件是否可以解决这个问题?

如果<exec>任务不能满足您的要求,也许一个类似于<exec>任务的自定义msbuild任务可以解决这个问题。

更新:
我刚刚尝试在我的msbuild文件中使用<Exec Command="" />代替PostBuild事件,但它仍然使Visual Studio IDE忙碌/无响应。

也许我们可以创建一个自定义的msbuild任务,调用Application.DoEvents来保持UI的响应性?

更新#2: 我上传了一个补丁到MSBuild Extension Pack,实现了一个名为SmartExec的自定义msbuild任务,可以解决这个问题。

http://msbuildextensionpack.codeplex.com/workitem/9053
http://msbuildextensionpack.codeplex.com/SourceControl/list/patches
Patch Id 9878


它刚刚作为变更集69252的一部分提交了。 - Rami A.
个人而言,我最终还是坚持使用VS2008,因为2010引入了一些其他的错误。升级后出现退化现象似乎不值得付费。看起来你成功地解决了这个问题,所以答案肯定被接受! :) - J23
这是一个旧帖子,但为了后人着想,我想指出这个更改已经集成到最新的构建中。 - Jeff Walker
@JeffWalker 最新的构建是什么?我正在使用 VS Premium 2013,它也有同样的 bug。长时间运行的 post-build 事件在完全完成之前不会更新 Build Output 控制台。因此,它看起来像是挂起了。 - John Henckel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接