如何从Delphi执行MSBuild?

时间:2016-07-14 17:48:13

标签: delphi batch-file command-line msbuild

我致力于自动化我们的软件构建/部署过程。其中一个主要部分是执行msbuild来编译多个Delphi项目。

在众多资源such as this one之后,我可以从RAD Studio命令行(它只是调用rsvars.bat来设置一些环境变量)成功完成。但是,当尝试自动执行此批处理文件和Delphi的msbuild命令时,我无法弄清楚如何继续。

问题的关键是批处理文件和实际的msbuild命令是两个完全独立的命令 - 尽管它们需要在相同的环境下一起运行。我发现this question有点相关,但我没有看到我的情景的明确答案。

如何在首次使用msbuild中的环境变量进行准备时,从Delphi执行rsvars.bat

2 个答案:

答案 0 :(得分:8)

this answer所示,您可以使用命令行参数运行cmd.exe来执行命令。

根据cmd.exe documentation

  

语法

cmd [/c|/k] [/s] [/q] [/d] [/a|/u] [/t:{<B><F>|<F>}] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] [<String>]
     

参数

     

/ C
  执行 String 指定的命令,然后停止   ...
  &LT;字符串&GT;
  指定要执行的命令   ...

     

说明

     
      
  • 使用多个命令

         

    要对&lt; String&gt;使用多个命令,请使用命令分隔符&amp;&amp; 将它们分开,并将它们用引号括起来。例如:

    "<Command>&&<Command>&&<Command>"
    
  •   
  • 处理引号

         

    如果您指定 / c / k ,则cmd会处理 String 的剩余部分,并且仅当所有的引号都保留时才会保留引号符合以下条件:

         
        
    • 您不使用 / s

    •   
    • 您只使用一组引号。

    •   
    • 您不会在引号中使用任何特殊字符(例如:& < > ( ) @ ^ |)。

    •   
    • 在引号中使用一个或多个空格字符。

    •   
    • 引号中的 String 是可执行文件的名称。

    •   
         

    如果不满足先前的条件,则通过检查第一个字符来处理 String 以验证它是否是开始引号。如果第一个字符是开始引号,则它将与右引号一起被剥离。保留右引号后面的任何文字。

  •   

因此,请尝试使用CreateProcess()ShellExecute/Ex()使用以下参数运行cmd.exe的实例:

cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..."

或者,您可以让您的应用加载rsvars.bat并解析它定义的值(或者只是在您自己的代码中定义值),然后使用msbuild执行CreateProcess(),将所需的环境变量传递给其lpEnvironment参数。这样,您根本不需要实际执行rsvars.bat

答案 1 :(得分:3)

另一种有效的方法是将两个命令放在另一个新的批处理文件中。这也允许您使用相同的环境构建多个项目。例如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"