2016-07-14 51 views
3

我正在自动化我们的软件的构建/部署过程。其中一个主要部分是执行msbuild来编译多个Delphi项目。如何从Delphi执行MSBuild?

以下大量资源such as this one,我可以从RAD Studio命令行(简单地调用rsvars.bat来设置一些环境变量)成功完成。但是,当试图自动化这个批处理文件和Delphi的msbuild命令时,我无法弄清楚如何继续。

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

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

+1

如果是我,我会口rsvars德尔福和创造的MSBuild过程中直接 –

回答

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
实施由字符串指定的命令,然后停止。
...
<字符串>
指定您要执行的命令。
...

备注

  • 使用多个命令

    要为<字符串>使用多个命令,该命令分离& &将它们分开,并请将其用引号。例如:

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

    如果指定/C/K,CMD进程字符串的剩余部分,并引号被保留只有当所有的满足以下条件:

    • 您不使用/s

    • 您恰好使用一组引号。

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

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

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

    如果上述条件不能满足,字符串通过检查的第一个字符以验证其是否为左引号。如果第一个字符是开头引号,则会随着结束引号被删除。结束引号后面的任何文本都会保留。

所以尽量使用CreateProcess()ShellExecute/Ex()与这些参数运行的cmd.exe一个实例:

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

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

+0

都应该加引号缠绕所有参数?我认为这就是抛弃我的原因,因为一些参数本身在完整路径/文件名值附近有自己的引号。 –

+0

@JerryDodge:根据我发布的文档,整个''需要用引号括起来以便使用'&&',而且单个命令也可以有自己的引用参数。我用文档的更大引用更新了我的答案。 –

+0

谢谢你,这个伎俩。但是现在我正在追求如何彻底忽略'rsvars.bat'文件,并直接调用'msbuild'。 –

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" 
+2

如果使用'/ C',命令完成后'cmd.exe'终止。如果您使用'/ K',它会继续运行。 –

+0

@Remy正式注意并更新。谢谢。 –