【问题标题】:How to execute MSBuild from Delphi?如何从 Delphi 执行 MSBuild?
【发布时间】:2016-07-14 17:48:13
【问题描述】:

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

根据大量资源such as this one,我可以从 RAD Studio 命令行成功完成(只需调用rsvars.bat 来设置一些环境变量)。但是,当尝试自动执行此批处理文件和 Delphi 的 msbuild 命令时,我不知道如何继续。

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

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

【问题讨论】:

  • 如果是我,我会将 rsvars 移植到 Delphi 并直接创建 msbuild 进程

标签: delphi batch-file command-line msbuild


【解决方案1】:

正如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 指定的命令,然后停止。
...

指定要执行的命令。
...

备注

  • 使用多个命令

    要为 使用多个命令,请用命令分隔符 && 将它们分开,并用引号将它们括起来。例如:

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

    如果您指定 /c/k,cmd 会处理 String 的其余部分,并且仅当所有满足以下条件:

    • 您不使用 /s

    • 您只使用了一组引号。

    • 请勿在引号内使用任何特殊字符(例如:&amp; &lt; &gt; ( ) @ ^ |)。

    • 您在引号内使用了一个或多个空白字符。

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

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

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

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

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

【讨论】:

  • 引号是否应该包含在所有参数中?我认为这就是让我失望的原因,因为一些参数本身在完整路径/文件名值周围有自己的引号。
  • @JerryDodge:根据我发布的文档,整个&lt;String&gt; 需要用引号括起来才能使用&amp;&amp;,并且各个命令也可以有自己的引用参数。我用更大的文档引用更新了我的答案。
  • 谢谢你,成功了。但是现在我正在研究如何完全忽略rsvars.bat文件,直接调用msbuild
  • 好吧,你不能忽略它,因为它确实定义了一些Delphi项目实际使用的重要环境变量。但是您不需要执行rsvars.bat 本身来将这些变量提供给msbuild,您可以直接将它们传递给CreateProcess()
  • 这就是我的意思,忽略实际文件本身,直接在我的应用程序中实现相同的东西。我还重新措辞了我的问题,以便我要求除rsvars.bat之外的任何其他可能性。
【解决方案2】:

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

【讨论】:

  • 如果你使用/Ccmd.exe会在命令完成后终止。如果你改用/K,它会继续运行。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多