![](/img/trans.png)
[英]How to compile a Delphi projectgroup using MSBuild called from an Embarcadero Makefile
[英]How to execute MSBuild from Delphi?
我正在致力於自動化我們軟件的構建/部署過程。 其中一個主要部分是執行msbuild
來編譯多個 Delphi 項目。
遵循諸如this之類的眾多資源,我可以從RAD Studio命令行成功地做到這一點(它只是調用rsvars.bat
來設置一些環境變量)。 但是,當嘗試自動執行此批處理文件和來自 Delphi 的msbuild
命令時,我無法弄清楚如何繼續。
問題的關鍵在於批處理文件和實際的msbuild
命令是兩個完全獨立的命令——盡管它們需要在同一環境下一起運行。 我發現這個問題有些相關,但我沒有看到我的場景的明確答案。
在首先使用rsvars.bat
的環境變量准備它時,如何從 Delphi 執行msbuild
?
正如此答案所示,您可以使用命令行參數運行cmd.exe
本身來執行命令。
根據cmd.exe 文檔:
語法
cmd [/c|/k] [/s] [/q] [/d] [/a|/u] [/t:{<B><F>|<F>}] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] [<String>]
參數
/c
執行字符串指定的命令,然后停止。
...
<字符串>
指定要執行的命令。
...備注
使用多個命令
要對 <String> 使用多個命令,請用命令分隔符&&將它們分開,並用引號將它們括起來。 例如:
"<Command>&&<Command>&&<Command>"
處理引號
如果指定/c或/k ,則 cmd 處理String的其余部分,並且僅在滿足以下所有條件時才保留引號:
您不使用/s 。
您只使用一組引號。
不要在引號內使用任何特殊字符(例如:
& < > ( ) @ ^ |
)。您可以在引號內使用一個或多個空白字符。
引號內的字符串是可執行文件的名稱。
如果不滿足前面的條件,則通過檢查第一個字符以驗證它是否為左引號來處理String 。 如果第一個字符是左引號,則它會與右引號一起被刪除。 保留引號后的任何文本。
因此,請嘗試使用CreateProcess()
或ShellExecute/Ex()
運行具有以下參數的cmd.exe
實例:
cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..."
或者,您可以讓您的應用程序加載rsvars.bat
並解析它定義的值(或僅在您自己的代碼中定義值),然后使用CreateProcess()
執行msbuild
,將所需的環境變量傳遞給其lpEnvironment
參數。 這樣,您根本不需要實際執行rsvars.bat
。
另一種有效的方法是將兩個命令放在另一個新的批處理文件中。 這也允許您使用相同的環境構建多個項目。 例如DoBuild.bat
具有以下內容:
call "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat"
msbuild "<path>\MyProject.dproj"
msbuild "<path>\MyOtherProject.dproj"
msbuild "<path>\YetAnotherProject.dproj"
然后,只需執行您的批處理文件:
Cmd.exe /K "<path>\DoBuild.bat"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.