HOW TO:利用VS.NET IDE批量編譯解決方案

Author:水如煙<?XML:NAMESPACE PREFIX = O />

 

 

IDE可以把多個工程項目組織起來,並根據工程間的引用關係自動按先後順序編譯各個工程項目。有的時候,或者編程分工,或者工程項目內容比較多,或者有些工程項目獨立性較強,我們就把這些工程項目獨立到一個或多個解決方案裏面。這樣,當這些工程項目修改之後,引用它的項目都需要重新編譯。按照通常的做法,我們需要按引用關係逐個打開解決方案進行編譯。如果方案多,或者那些項目修改頻繁,這個“點擊編譯”的工序,令人煩心。下面,介紹一種利用BAT文件批量編譯的方法。


VS.NET的IDE既是一個WINDOW界面程序,也接受DOS命令行方式。IDE的應用程序名稱爲devenv,接受DOS命令行方式的程序爲devenv.com,最終由devenv.exe解釋執行。正常安裝情況下,程序置於“X:/Program Files/Microsoft Visual Studio */Common7/IDE”目錄。其中X表示系統所在驅動符,*表示VS.NET版本號,對於VS2008爲“9.0”,VS2005爲“8.0”,VS2003爲“.NET 2003”。

VS.NET在安裝的時候,賦予系統多個環境變量。瞭解系統的環境變量,你可以打開“附件”裏的“DOS命令提示符”(它是Windows命令解釋程序),打入命令“SET”然後回車,就可以看到所有的環境變量的名稱、值。

注:有人不明白Dim cmd As String = System.Environment.GetEnvironmentVariable("ComSpec")是什麼意思,它就是獲取系統命令解釋程序即cmd.exe的全文件名稱,一般是“X:/WINDOWS/System32/cmd.exe”。在上面的命令結果中可以看到“ComSpec”值。

在列出的結果中,首先留意PATH值。可以發現,VS.NET安裝時並沒有把devenv所在的目錄列入搜索路徑裏面。與VS.NET有關的環境變量,有“VS*COMNTOOLS”,*表示版本,對於VS2008爲“90”,VS2005爲“80”。(VS2003的我這沒安裝,不清楚。)以下以VS2008爲例。

“VS90COMNTOOLS”的值通常爲“X:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/”。由此變量,可以間接取得devenv所在目錄即“%VS90COMNTOOLS%../IDE/”。

到此,可以編寫BAT文件了。我的BAT文件爲Build.bat,放在“桌面”上,內容如下:
SET VSCMD=%VS90COMNTOOLS%../IDE/devenv
"%VSCMD%"  "D:/正式代碼/SolutionForSystem/SolutionForSystem.sln" /Rebuild
"%VSCMD%"  "D:/正式代碼/SolutionForFoxPro/SolutionForFoxPro.sln" /Rebuild
"%VSCMD%"  "D:/正式代碼/SolutionForWindowsForms/SolutionForWindowsForms.sln" /Rebuild
"%VSCMD%"  "D:/正式代碼/SolutionForSystemData/SolutionForSystemData.sln" /Rebuild
"%VSCMD%"  "D:/正式代碼/SolutionForDBaseDatabase/SolutionForDBaseDatabase.sln" /Rebuild
"%VSCMD%"  "D:/正式代碼/SolutionForDatabaseUI/SolutionForDatabaseUI.sln" /Rebuild


由於目錄名稱和項目名稱有規律,最後修改如下:
@SET VSCMD=%VS90COMNTOOLS%../IDE/devenv
@FOR %%i IN ("System", "FoxPro","WindowsForms","SystemData","DBaseDatabase","DatabaseUI") DO "%VSCMD%" "D:/正式代碼/SolutionFor%%~i/SolutionFor%%~i.sln" /Rebuild

注:MSBuild.exe也可以實現命令行編譯,它是直接引用Microsoft.Build.BuildEngine.Engine來實現編譯功能。MSBuild.exe存於“X:/WINDOWS/Microsoft.NET/Framework/v*”目錄下,其中*爲Framework主版本號。

注:在DOS界面下,cd 到命令所在目錄,命令 /?可以看到運行命令所需的參數及用法。可以通過管道重定義結果輸出。比如看devenv.com的用法:
devenv /? > c:/HelpForDevenv.txt
執行後打開HelpForDevenv.txt文件,內容如下:


Microsoft (R) Visual Studio 9.0.30729.1 版。
版權所有(C) Microsoft Corp。保留所有權利。

用法:
devenv  [solutionfile | projectfile | anyfile.ext]  [switches]

devenv 的第一個參數通常是一個解決方案文件或項目文件。
如果您希望在編輯器中自動打開文件,
也可以使用任何其他文件作爲第一個參數。當您輸入項目文件時,IDE
會在項目文件的父目錄中查找與該項目文件具有相同
基名稱的 .sln 文件。如果不存在這樣的 .sln 文件,
IDE 將查找引用該項目的單個 .sln 文件。如果不存在這樣的單個
.sln 文件,則 IDE 將創建一個具有默認 .sln 文件名的未保存
的解決方案,其基名稱與項目文件的基名稱相同。

命令行生成:
devenv solutionfile.sln /build [ solutionconfig ] [ /project projectnameorfile [ /projectconfig name ] ]
可用的命令行開關:

/Build  使用指定的解決方案配置生成解決方案或
  項目。例如“Debug”。如果可能存在多個平臺,
  則配置名稱必須用引號括起來
  並且包含平臺名稱。例如“Debug|Win32”。
/Clean  刪除生成結果。
/Command 啓動 IDE 並執行該命令。
/Deploy  生成並部署指定的生成配置。
/Edit  在此應用程序的運行實例中打開
  指定文件。如果沒有正在運行的實例,
  則啓動一個具有簡化窗口布局的新實例。
/LCID  設置 IDE 中用於用戶界面的默認語言。
/Log  將 IDE 活動記錄到指定的文件以用於故障排除。
/NoVSIP  禁用用於 VSIP 測試的 VSIP 開發人員許可證密鑰。
/Out  將生成日誌追加到指定的文件中。
/Project 指定生成、清理或部署的項目。
  必須和 /Build、/Rebuild、/Clean 或 /Deploy 一起使用。
/ProjectConfig 重寫解決方案
  配置中指定的項目配置。例如“Debug”。如果可能存在
  多個平臺,則配置名稱必須用引號括起來
  幷包含平臺名稱。例如“Debug|Win32”。
  必須和 /Project 一起使用。
/Rebuild 先清理,然後使用指定配置生成
  解決方案或項目。
/ResetAddin 移除與特定外接程序關聯的命令和命令用戶界面。
/ResetSettings 恢復 IDE 的默認設置,還可以重置爲
  指定的 VSSettings 文件。
/ResetSkipPkgs 清除所有添加到 VSPackages 的 SkipLoading 標記。
/Run  編譯並運行指定的解決方案。
/RunExit 編譯並運行指定的解決方案然後關閉 IDE。
/SafeMode 以安全模式啓動 IDE,加載最少數量的窗口。
/Upgrade 升級項目或解決方案以及其中的所有項目。
  並相應地創建這些文件的備份。有關備份
  過程的更多信息,請參見
  “Visual Studio 轉換向導”上的幫助。

產品特定的開關:

/debugexe       打開要調試的指定可執行文件。
                命令行的其餘部分作爲它的參數
                傳遞到此執行文件。
/useenv  使用 PATH、INCLUDE、LIBPATH 和 LIB 環境變量
  而不是使用 VC++ 生成的 IDE 路徑。

要從命令行附加調試器,請使用:
 VsJITDebugger.exe -p <pid>


瞭解MsBuild的用法:
執行MSBuild /? > c:/HelpForMSBuild.txt
HelpForMSBuild.txt內容如下:


Microsoft (R) 生成引擎版本 3.5.30729.1
[Microsoft .NET Framework 版本 2.0.50727.3053]
版權所有(C) Microsoft Corporation 2007。保留所有權利。

語法:              MSBuild.exe [選項] [項目文件]

描述:          在項目文件中生成指定的目標。如果
                     未指定項目文件,MSBuild 將搜索
                     當前工作目錄來查找文件擴展名
                     以“proj”結尾的文件並使用該文件。

開關:

  /target:<targets>  在此項目中生成這些目標。使用
                     分號或逗號分隔多個目標,或者分別指定
                     每個目標。(縮寫: /t)
                     示例:
                       /target:Resources;Compile

  /property:<n>=<v>  設置或重寫這些項目級屬性。<n> 是
                     屬性名,<v> 爲屬性值。請使用
                     分號或逗號分隔多個屬性,或者
                     分別指定每個屬性。(縮寫: /p)
                     示例:
                       /property:WarningLevel=2;OutDir=bin/Debug/

  /maxcpucount[:n]   指定用於生成的最大
                     併發進程數。如果未使用開關,則使用的默認值
                     爲 1。如果使用開關時不帶值,
                     MSBuild 將最多使用計算機上的
                     處理器數。(縮寫: /m[:n])
     
  /toolsversion:<version>
                     要在生成過程中使用的 MSBuild 工具集
                     (任務、目標等) 的版本。此版本將重寫
                     個別項目指定的版本。(縮寫:
                     /tv)
                     示例:
                       /toolsversion:3.5
  
  /verbosity:<level> 在事件日誌中顯示此級別的信息量。
                     可用的詳細級別有: q[uiet]、 m[inimal]、
                     n[ormal]、d[etailed] 和 diag[nostic]。(縮寫: /v)
                     示例:
                       /verbosity:quiet

  /consoleloggerparameters:<parameters>
                     控制檯記錄器的參數。(縮寫: /clp)
                     可用的參數有:
                        PerformanceSummary -- 顯示在任務、目標和項目上
                            花費的時間。
                        Summary -- 結束時顯示錯誤和警告的摘要。
                        NoSummary -- 結束時不顯示錯誤和警告
                            的摘要。
                        ErrorsOnly -- 僅顯示錯誤。
                        WarningsOnly -- 僅顯示警告。
                        NoItemAndPropertyList -- 在開始生成每個項目時不顯示
                            項和屬性的列表。   
                        ShowCommandLine -- 顯示 TaskCommandLineEvent 消息 
                        ShowTimestamp -- 將時間戳作爲所有消息的前綴
                            顯示。                                          
                        ShowEventId -- 顯示已開始事件、已完成事件和消息
                            的事件 ID。
                        ForceNoAlign -- 不將文本與控制檯緩衝區的大小
                            匹配。
                        DisableMPLogging -- 在非多處理器
                            模式下運行時,禁用輸出的多處理器
                            日誌記錄樣式。
                        EnableMPLogging -- 即使在非多處理器
                            模式下運行,也啓用多處理器
                            日誌記錄樣式。默認情況下啓用此日誌記錄樣式。
                        Verbosity -- 重寫此記錄器的  /verbosity
                            設置。
                     示例:
                        /consoleloggerparameters:PerformanceSummary;NoSummary;
                                                 Verbosity=minimal

  /noconsolelogger   禁用默認控制檯記錄器,並且不將事件
                     記錄到控制檯。(縮寫: /noconlog)

  /fileLogger[n]     將生成輸出記錄到文件中。默認情況下,
                     該文件在當前目錄中,名稱爲
                     “msbuild[n].log”。所有節點中的事件合併到
                     單個日誌中。fileLogger 的文件和
                     其他參數的位置可以通過添加
                     “/fileLoggerParameters[n]”開關來指定。
                     “n”(如果存在)可以爲 1-9 的數字,允許最多附加
                     10 個文件記錄器。(縮寫: /fl[n])
   
  /fileloggerparameters[n]:<parameters>                               
                     爲文件記錄器提供任何額外的參數。
                     存在此開關意味着
                     存在對應的 /filelogger[n] 開關。
                    “n”(如果存在)可以爲 1-9 的數字。
                     任何分佈式文件記錄器也可以使用
                     /fileloggerparameters,具體可參閱 /distributedFileLogger 的說明。
                     (縮寫: /flp[n])
                     爲控制檯記錄器列出的相同參數
                     可用。某些其他可用參數有:
                        LogFile -- 生成日誌將寫入其中的
                            日誌文件的路徑。
                        Append -- 確定是將生成日誌附加到日誌文件,
                            還是覆蓋日誌文件。如果設置此
                            開關,則會將生成日誌附加到日誌文件;
                            如果不設置此開關,則會覆蓋
                            現有日誌文件的內容。
                            默認值爲不附加到日誌文件。
                        Encoding -- 指定文件的編碼,
                            例如,UTF-8、Unicode 或 ASCII
                     默認的詳細級別爲 Detailed。
                     示例:
                       /fileLoggerParameters:LogFile=MyLog.log;Append;
                                           Verbosity=diagnostic;Encoding=UTF-8

                       /flp:Summary;Verbosity=minimal;LogFile=msbuild.sum
                       /flp1:warningsonly;logfile=msbuild.wrn
                       /flp2:errorsonly;logfile=msbuild.err
   
  /distributedlogger:<central logger>*<forwarding logger>                    
                     使用此記錄器來記錄 MSBuild 中的事件,向每個節點
                     附加不同的記錄器實例。若要指定
                     多個記錄器,請分別指定每個記錄器。
                     (縮寫 /dl)
                     <logger> 語法爲:
                       [<logger class>,]<logger assembly>[;<logger parameters>]
                     <logger class> 語法爲:
                       [<partial or full namespace>.]<logger class name>
                     <logger assembly> 語法爲:
                       {<assembly name>[,<strong name>] | <assembly file>}
                     <logger parameters> 是可選的,並且按鍵入的
                     形式原樣傳遞給記錄器。(縮寫: /l)
                     示例:
                       /dl:XMLLogger,MyLogger,Version=1.0.2,Culture=neutral
                       /dl:MyLogger,C:/My.dll*ForwardingLogger,C:/Logger.dll

  /distributedFileLogger                                                      
                     將生成輸出記錄到多個日誌文件,每個 MSBuild 節點
                     一個日誌文件。這些文件的初始位置爲
                     當前目錄。默認情況下,這些文件名爲
                     “MSBuild<nodeid>.log”。可通過添加
                     “/fileLoggerParameters”開關來指定
                     這些文件的位置和 fileLogger 的其他參數。

                     如果日誌文件名是通過 fileLoggerParameters
                     開關設置的,分佈式記錄器將使用 fileName 作爲
                     模板並將節點 ID 附加到此 fileName
                     以便爲每個節點創建一個日誌文件。
   
  /logger:<logger>   使用此記錄器來記錄 MSBuild 中的事件。若要指定
                     多個記錄器,請分別指定每個記錄器。
                     <logger> 語法爲:
                       [<logger class>,]<logger assembly>[;<logger parameters>]
                    <logger class> 語法爲:
                        [<partial or full namespace>.]<logger class name>
                   <logger assembly> 語法爲:
                        {<assembly name>[,<strong name>] | <assembly file>}
                     <logger parameters> 是可選的,並按鍵入的
                    形式原樣傳遞給記錄器。(縮寫: /l)
                     示例:
                       /logger:XMLLogger,MyLogger,Version=1.0.2,Culture=neutral
                       /logger:XMLLogger,C:/Loggers/MyLogger.dll;OutputAsHTML

  /validate          依據默認架構驗證項目。(縮寫:
                     /val)

  /validate:<schema> 依據指定的架構驗證項目。 (縮寫:
                     /val)
                     示例:
                       /validate:MyExtendedBuildSchema.xsd

  /ignoreprojectextensions:<extensions>
                     確定要生成哪個項目文件時要忽略的
                     擴展名的列表。使用分號或逗號來分隔
                     多個擴展名。
                     (縮寫: /ignore)
                     示例:
                       /ignoreprojectextensions:.vcproj,.sln
   
  /nodeReuse:<parameters>
                     允許或禁止重複使用 MSBuild 節點。
                     參數包括:
                     True -- 生成完成後節點將保留,
                             並且將由後面的生成重複使用(默認)
                     False -- 生成完成後節點將不會保留
                     (縮寫: /nr)
                     示例:
                       /nr:true
   
  @<file>            從文本文件插入命令行設置。若要指定
                     多個響應文件,請分別指定每個響應
                     文件。

  /noautoresponse    不自動包括 MSBuild.rsp 文件。(縮寫:
                     /noautorsp)

  /nologo            不顯示啓動版權標誌和版權消息。

  /version           僅顯示版本信息。(縮寫: /ver)

  /help              顯示此用法消息。(縮寫: /? 或 /h)

示例:

        MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release
        MSBuild MyApp.csproj /t:Clean
                             /p:Configuration=Debug;TargetFrameworkVersion=v3.5
   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章