2011-06-07 96 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