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.
还是有点拗口的单个错误消息,但不是让所有我们搬进批处理文件的代码更易于管理包括在错误消息!
即使如此,这将是很好能够定制出现在错误列表中显示的东西我定义这个错误信息。我怀疑这是可能的,但如果有人知道这样做的方式,请不要犹豫,以发表评论!
来源
2011-06-08 09:33:41
Jez
@stijn好奇,我没有看到'执行预生成事件...'在我的输出。你使用的是什么版本的Visual Studio?另外,您可以粘贴“预生成事件命令行”窗口内容的全部内容吗? – Jez 2011-06-07 16:07:18
更新了答案。你能准确地发布你在命令行中使用的东西吗?我试了几件事情,但我无法得到它显示整个命令行 – stijn 2011-06-07 19:41:23
@stijn唉唉......你是一个C++编译和我建立一个C#项目,这可以解释为什么我没有看到'执行预生成事件输出。我确实看到第二个。我会尝试运行一个.bat文件,看看会发生什么。我不太明白'我无法显示整个命令行'。你的命令行是'd:\ test.bat';它在你的输出中显示整个命令行,是不是(对于C#构建)? – Jez 2011-06-07 20:29:26