2011-06-07 60 views
9

我为我的Visual Studio 2008项目(实际上主要是生成后事件脚本)提供了一些适度的高级生成前和生成后事件脚本。他们工作正常,因为他们正常工作,当我exit 0生成成功,当我exit 1生成失败,并出现错误。然而,这个错误是巨大的,是这样的:使生成前和生成后的事件脚本漂亮吗?

The command "if Release == Debug goto Foo 
if Release == Release goto Bar 
exit 0 

:Foo 
mkdir "abc" 
copy "$(TargetDir)file.dll" "abc" 
[...] 
" exited with code 1. 

你的想法。整个脚本总是作为错误描述的一部分被丢弃。在生成过程中,整个脚本也会在Output窗口中放出。那么,为什么我在网上看到了在这些脚本中使用echo的各种引用?例如,这里是在一个特定的网站的示例的一部分:

:BuildEventFailed 
echo POSTBUILDSTEP for $(ProjectName) FAILED 
exit 1 
:BuildEventOK 
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK 

有没有办法让Visual Studio来抑制所有脚本的输出除了什么是echo ED(因此使用echo只有你想要的输出会是有意义的),还是这些例子只是被误导了,他们没有意识到整个脚本总是被抛弃?

回答

7

OK - 问题的核心似乎是在Visual Studio C++和C#编译引擎有很大的不同。

C++构建引擎执行项目的生成前或生成后事件'命令行'中指定的批处理代码,但不将转储到输出窗口;它只是抛出代码编辑的echo,以及代码执行的命令发出的内容(例如copy命令的'2个文件被复制'等)。我已经看到了围绕web大概是用于Visual Studio的C++构建引擎,因为如果要将C#预生成或后生成的批处理代码放入C#项目的“事件命令行”框中,则无需真正使用C#构建引擎来回显任何内容。

这是因为C#编译引擎,我用它,倾倒在框中输出窗口中的所有代码。而且,如果代码失败,它将在错误消息中包含该框中的整个代码块,该代码块将出现在“错误列表”中 - C++构建引擎不会(稍后会详细介绍)。

我已经找到了最好的解决方案,因此,为最大限度地减少代码,你放在一个C#项目的前或生成后事件命令行箱量。您放入的所有内容都将在执行时转储到输出窗口。最小化代码的最好方法是使其只执行批处理文件,并将必要的参数传递给批处理文件。该批处理文件中的内容将不被转储到输出窗口中,但是(如与在“命令行”为C++构建引擎的代码)echo输出和输出从命令批处理文件代码执行将是;这是控制C#前置或后置编译脚本输出的好方法。然后,C++构建引擎以与C#引擎在批处理文件中处理代码相同的方式处理'命令行'框中指定的代码;它不会转储代码本身,只是代码的输出。

所以基本上,如果你正在编译在Visual Studio C++项目,你可以把所有的批处理脚本在“命令行”框,将无法完全转储到输出窗口。但是,如果编译C#项目,我建议将您的批处理脚本放在单独的.bat文件中,并且只需使用生成前或生成后事件命令行框中的适当参数调用该文件即可。我结束了我的C#生成后事件命令行框中看起来像这样:

..\..\BuildScripts\PostBuild.bat $(ConfigurationName) $(ProjectName) "$(TargetDir)" "$(ProjectDir)" 

...我PostBuild.bat文件看起来像这样:

@REM Store args... 
set _configName=%1% 
set _projectName=%2% 

@REM Remove quotes from remaining args... 
set _targetDir=###%3%### 
set _targetDir=%_targetDir:"###=% 
set _targetDir=%_targetDir:###"=% 
set _targetDir=%_targetDir:###=% 

set _projectDir=###%4%### 
set _projectDir=%_projectDir:"###=% 
set _projectDir=%_projectDir:###"=% 
set _projectDir=%_projectDir:###=% 

if %_configName% == Release goto StartProcessing 
echo No post-build processing required. 
exit 0 

@REM Start post-build processing 
:StartProcessing 
echo Starting post-build processing. 

@REM use input args to do batch script work, such as: 
copy "%_targetDir%*.dll" "%_projectDir%..\..\..\..\..\CommonAssemblies" 
if errorlevel 1 goto CopyFailure 

@REM etc. 

goto PostBuildSuccess 

@REM Failure labels 
:CopyFailure 
echo Post-build processing for %_projectName% FAILED: Failed to copy file(s) to common assemblies directory! 
exit 1 

@REM Post-build success 
:PostBuildSuccess 
echo Post-build processing for %_projectName% completed OK. 
exit 0 

该控制输出更整齐地,只有在这个批处理脚本中的东西echo将被输出到输出窗口。

最后,如上所述,当构建后处理失败时,C#和C++构建引擎也会在出现在“错误列表”中的错误消息中输出不同的内容(即批处理代码以非代码0)。 ++构建引擎的C似乎总是只说:

Error result 1 returned from 'C:\Windows\system32\cmd.exe'. 

C#的编译引擎,但是,将包括前或生成后事件命令行框中错误消息(取失败)的全部内容,例如:

The command "..\..\BuildScripts\PostBuild.bat Release MyProject "C:\Development\MyProject\bin\" "C:\Development\MyProject\"" exited with code 1. 

还是有点拗口的单个错误消息,但不是让所有我们搬进批处理文件的代码更易于管理包括在错误消息!

即使如此,这将是很好能够定制出现在错误列表中显示的东西我定义这个错误信息。我怀疑这是可能的,但如果有人知道这样做的方式,请不要犹豫,以发表评论!

5

如果你把你的脚本放在一个批处理文件中,VS对此非常沉默。当你需要访问$(projectName)等时,你将不得不将它们作为参数传递给批处理文件。我查找可能会影响输出但找不到任何设置的设置。

用此批处理文件(d:\ test.bat)进行测试;在关闭@echo甚至不需要

@echo off 
echo "I'm Gonna Fail" 
exit 1 

设置Pre-Build Event->Command Lined:\ test.bat的,离开Description空(说明显示什么,而不是执行预生成事件... 。在VS2008,我得到这个在生成输出窗口的C++项目:

Performing Pre-Build Event... 
"I'm Gonna Fail" 
Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'. 

对于C#项目,这,则将显示(正常设置为):

Target PreBuildEvent: 
    d:\test.bat 
    "I'm gonna fail" 
    Microsoft.Common.targets(895,9) error MSB3073: The command "d:\test.bat" exited with code 1. 
+0

@stijn好奇,我没有看到'执行预生成事件...'在我的输出。你使用的是什么版本的Visual Studio?另外,您可以粘贴“预生成事件命令行”窗口内容的全部内容吗? – Jez 2011-06-07 16:07:18

+0

更新了答案。你能准确地发布你在命令行中使用的东西吗?我试了几件事情,但我无法得到它显示整个命令行 – stijn 2011-06-07 19:41:23

+0

@stijn唉唉......你是一个C++编译和我建立一个C#项目,这可以解释为什么我没有看到'执行预生成事件输出。我确实看到第二个。我会尝试运行一个.bat文件,看看会发生什么。我不太明白'我无法显示整个命令行'。你的命令行是'd:\ test.bat';它在你的输出中显示整个命令行,是不是(对于C#构建)? – Jez 2011-06-07 20:29:26