【问题标题】:MSBuild in a Powershell Script - How do I know if the build succeeded?Powershell 脚本中的 MSBuild - 我如何知道构建是否成功?
【发布时间】:2011-04-29 23:21:39
【问题描述】:

我正在使用 Powershell 编写构建脚本。这些脚本执行各种操作,例如从 SVN 获取最新的源代码、备份等,并使用 MSBuild 构建解决方案:

cmd /c C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe "C:\Dev\Path\MyProjct.sln" /p:Configuration=Release 

在这条指令之后,如果编译成功,我只想执行脚本的其余部分。我该如何检查?

该项目是一个网络项目,因此检查输出并不容易,但我猜一些变量会包含编译结果。另外,由于我使用 cmd /c 调用 msbuild,我可以访问这些变量吗?

【问题讨论】:

  • 我只是好奇...为什么要使用 PowerShell 脚本来构建?为什么不使用 MSBuild 文件并使用扩展任务库来执行诸如从 SVN 获取之类的操作? PowerShell 很酷且功能强大,但在某种程度上,你正在采取艰难的方式。
  • 嗯,首先我并不真正了解 MSBuild,但我认为它是一个构建工具,我可能很难与其他任何东西(SVN、WinRAR、. ..)。对我来说,构建只是开发过程的 5%,我认为脚本语言最适合其他 95%。但我很高兴错了。
  • MSBuild 是一个很棒的面向任务的依赖工具。使用 PowerShell 支持多种场景并支持面向产品的方法。也请查看 PSake,我们使用它。当您想要扩展事物时,您不必陷入 C#(MSBuild 任务)。您只需添加更多 PowerShell。
  • 我认为扩展您的 msbuild 脚本对于与构建相关且具有依赖管理的事物有意义(例如 A 依赖于 B;B 依赖于 C 和 D;D 已经改变,所以现在?)。如果您愿意,启用msbuild /p:SyncAndBuild 并不难。如果您决定执行更多 MSBuild,请使用 SO 寻求帮助。我有太多在 MSBuild 中编写复杂应用程序的经验,很乐意分享。

标签: powershell msbuild


【解决方案1】:

在调用 MSBUILD 后立即检查 $LastExitCode 的值。如果为 0,则 MSBUILD 成功,否则失败。

顺便说一句,不需要使用 cmd /c。直接调用 MSBUILD.exe 即可。我们一直在 PowerShell 构建脚本中这样做。

【讨论】:

  • 使用$LastExitCode时如何得到错误信息?
  • 您可以捕获exe的输出(包括stderr)。这与检查 $LastExitCode 的值是分开的。
  • 我使用 C# System.Management.Automation.PowerShell 对象并调用同步 Invoke 方法。问题是错误流没有条目,PowerShell.HadErrors 也不为真。
  • 当您设置执行 msbuild.exe 的命令时,尝试将 stderr 重定向到 stdout,例如2>&1.
  • 如果您使用System.Diagnostics.Process 运行msbuild,那么在进程退出后(即Process.HasExited 为真)您可以使用Process 对象的ExitCode 属性获取退出代码。
【解决方案2】:

要检查成功/失败,请使用自动变量$?

PS> help about_Automatic_Variables 美元? 包含上次操作的执行状态。它包含了 如果最后一个操作成功,则为 TRUE,如果失败,则为 FALSE。

例如:

构建 if (! $?) { throw "msbuild failed" }

【讨论】:

  • 虽然 $? 在这种情况下有效,但请注意,许多控制台 exe(尤其是 Microsoft 工具)会反转退出代码逻辑以返回多个成功代码。所以$? 不会对这些前任起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2011-08-10
  • 2010-11-02
相关资源
最近更新 更多