如何从Delphi执行MSBuild?

Jer*_*dge 3 delphi msbuild command-line batch-file

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

下面有无数的资源,如这一个,我可以从RAD Studio命令行(这是简单地调用成功地做到这一点rsvars.bat,以设置一些环境变量).但是,当试图自动化这个批处理文件和msbuildDelphi 的命令时,我无法弄清楚如何继续.

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

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

Rem*_*eau 8

由于这个答案表明,你可以运行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>]
Run Code Online (Sandbox Code Playgroud)

参数

/ c
执行String指定的命令然后停止.
...
<String>
指定要执行的命令.
...

备注

  • 使用多个命令

    要对<String>使用多个命令,请使用命令separator &&将它们分开,并将它们用引号括起来.例如:

    "<Command>&&<Command>&&<Command>"
    
    Run Code Online (Sandbox Code Playgroud)
  • 处理引号

    如果指定/ c/ k,cmd将处理String的其余部分,并且仅在满足以下所有条件时才保留引号:

    • 你不使用/ s.

    • 您只使用一组引号.

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

    • 您在引号内使用一个或多个空格字符.

    • 引号内的字符串是可执行文件的名称.

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

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

cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..."
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*dge 5

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

然后,只需执行您的批处理文件:

Cmd.exe /K "<path>\DoBuild.bat"
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用“/C”,“cmd.exe”将在命令完成后终止。如果您使用“/K”代替,它会继续运行。 (2认同)