Jez*_*Jez 11 c# scripting build visual-studio-2008 visual-studio
我的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.
Run Code Online (Sandbox Code Playgroud)
你明白了.整个脚本始终作为错误描述的一部分转出.在构建发生时,整个脚本也会在"输出"窗口中转储出来.那么,为什么我在网上看到各种参考文献echo在这些脚本中使用?例如,以下是一个特定网站上的示例的一部分:
:BuildEventFailed
echo POSTBUILDSTEP for $(ProjectName) FAILED
exit 1
:BuildEventOK
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK
Run Code Online (Sandbox Code Playgroud)
有没有办法让Visual Studio禁止除了echoed 之外的所有脚本输出(因此echo只使用输出你想要的东西),或者这些例子是误导的,他们没有意识到整个脚本是总是甩出来的?
好的 - 问题的核心似乎是Visual Studio C++和C#构建引擎完全不同.
C++构建引擎执行项目的构建前或构建后事件"命令行"中指定的批处理代码,而不将实际代码转储到"输出"窗口; 它只是转出echo代码编写的内容,以及代码执行的命令发送的内容(例如copy命令的'2个文件被复制'等).我在网上看到的例子是大概是用于Visual Studio的C++构建引擎,因为如果你在C#项目的"事件命令行"框中放置C#构建前或构建后的批处理代码,就不需要真正回应C#构建引擎.
这是因为C#编译引擎,我用它,并倾倒在框中输出窗口中的所有代码.更重要的是,如果代码失败,它将包含错误消息中该框中的整个代码块,该错误消息将显示在"错误列表"中 - C++构建引擎不会(稍后会详细介绍).
因此,我发现的最佳解决方案是最小化您在C#项目的构建前或构建后事件命令行框中放入的代码量.放在那里的所有东西都会在执行时被转储到Output窗口.最小化代码的最佳方法是使其只执行批处理文件,并将必要的参数传递给批处理文件.批处理文件的内容不会被转储到"输出"窗口,但是(与C++构建引擎的"命令行"中的代码一样)echo输出和批处理文件代码执行的命令输出将是; 这是控制C#预构建或后构建脚本输出的好方法.然后,C++构建引擎正在处理"命令行"框中指定的代码,其方式与C#引擎处理批处理文件中的代码的方式相同; 它不会转储代码本身,只是代码的输出.
所以基本上,如果你在Visual Studio中编译C++项目,你可以将所有批处理脚本放在"命令行"框中,并且不会将它们全部转储到"输出"窗口.但是,如果要编译C#项目,我建议将批处理脚本放在一个单独的.bat文件中,并使用构建前或生成后事件命令行框中的相应参数调用该文件.我最终得到了我的C#post-build事件命令行框,如下所示:
..\..\BuildScripts\PostBuild.bat $(ConfigurationName) $(ProjectName) "$(TargetDir)" "$(ProjectDir)"
Run Code Online (Sandbox Code Playgroud)
...和我的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
Run Code Online (Sandbox Code Playgroud)
这样可以更加整齐地控制输出,并且只有echo此批处理脚本中的内容才会输出到"输出"窗口.
最后,如上所述,当构建后处理失败时(即批处理代码以不同的代码退出0),C#和C++构建引擎也会在"错误列表"中显示的错误消息中输出不同的内容.C++构建引擎似乎总是说:
Error result 1 returned from 'C:\Windows\system32\cmd.exe'.
Run Code Online (Sandbox Code Playgroud)
但是,C#构建引擎将在错误消息中包含构建前或构建后事件命令行框的整个内容(以较少者为准),例如:
The command "..\..\BuildScripts\PostBuild.bat Release MyProject "C:\Development\MyProject\bin\" "C:\Development\MyProject\"" exited with code 1.
Run Code Online (Sandbox Code Playgroud)
对于单个错误消息仍然有点满口,但比将我们移入批处理文件中的所有代码包含在错误消息中更易于管理!
即便如此,能够自定义错误列表中显示的此错误消息以显示我定义的内容会更好.我怀疑这是可能的,但如果有人知道如何做到这一点,请不要犹豫,将其作为评论发布!
如果您将脚本放在批处理文件中,VS对此非常沉默.当您需要访问$(projectName)等时,您必须将它们作为参数传递给批处理文件.我查找了可能影响输出但无法找到的设置.
使用此批处理文件(d:\ test.bat)进行测试; 在关闭@echo甚至没有必要:
@echo off
echo "I'm Gonna Fail"
exit 1
Run Code Online (Sandbox Code Playgroud)
设置Pre-Build Event->Command Line为d:\ 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'.
Run Code Online (Sandbox Code Playgroud)
对于C#项目,显示的是(MSBuild verbosity设置为normal):
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23645 次 |
| 最近记录: |