我刚刚从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中,不是一点一点地显示Post-Build事件的进度,而是直接锁定直到整个事件完成 - 然后输出全部出现。当通过缓慢的网络连接进行复制时,这是一个特殊问题,因为我不知道一次可能发生几分钟的情况。没有办法猜测副本是否会持续5秒或5分钟;如果我还不熟悉编译器事件的顺序,我甚至不知道它是复制。
这是2010年的已知错误,还是有人知道现有的解决方法?
谢谢!
编辑1:项目是C#。
编辑2:我使用的确切Robocopy命令是robocopy.exe . \\192.168.5.7\Release /NJS /NJH /Z /W:1 /R:5 /E
答案 0 :(得分:2)
考虑到MS似乎不想很快解决这个问题,而且我们仍然希望继续前进到VS.NET 2010,我们已经设计了以下解决方法。这对我们来说并不理想,但足够好。
我们大多数长期运行的构建后事件我们只在构建发布时运行,而不是在一般软件开发期间运行。因此,在那些情况下,我们在外部命令窗口中运行这些事件,以便我们可以监视进度。
我们使用unix tee命令(抓住网络某处)在脚本完成后将输出添加到输出窗口。
在postbuild活动中,我们有:
@@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命令,可以进行资源编译,ilmerging,混淆,签名或者你需要的任何东西:)
答案 1 :(得分:1)
它对我来说几乎完全相同。我有一个后构建步骤,包括ILMerge,然后是DOS移动命令。从未显示ILMerge输出,但移动的输出是。我在http://connect.microsoft.com,ID 613727上提交了一个错误。
答案 2 :(得分:1)
我想知道使用msbuild <exec>
任务而不是后期构建事件是否会解决此问题?
如果<exec>
任务不符合您的要求,可能会执行与<exec>
任务类似的自定义msbuild任务,例如解决此问题。
<强>更新强>:
我只是尝试在我的msbuild文件中使用<Exec Command="" />
而不是PostBuild事件,但它仍然使Visual Studio IDE忙碌\无响应。
也许我们可以创建一个调用Application.DoEvents的自定义msbuild任务来保持UI响应?
更新#2 : 我上传了一个补丁到MSBuild扩展包,它实现了一个名为SmartExec的自定义msbuild任务,可以解决这个问题。
http://msbuildextensionpack.codeplex.com/workitem/9053
http://msbuildextensionpack.codeplex.com/SourceControl/list/patches
补丁ID 9878