【问题标题】:What context does MSBUILD run in?MSBUILD 在什么环境下运行?
【发布时间】:2013-02-12 21:47:50
【问题描述】:

当我们通过 MSBuild 运行构建时,MSBuild 在什么上下文中运行?

我问的原因是因为我有调用命令行程序(ajax 缩小)的预构建事件,如果项目是通过 VS2010(在同一台机器上)构建的,它可以完美运行,但在我们构建时不起作用系统(CCNet)正在构建它。我得到的错误是 9009,这意味着它找不到文件。命令行程序为其位置设置了环境路径(环境路径是通过 setx 设置的,也许它只为当前用户设置?),因此除了 CCNet 调用 MSBuild 之外,仅调用其名称在所有情况下都可以正常工作。

【问题讨论】:

  • 预构建事件由 MSBuild Exec 类执行。它在 cmd.exe 的隐藏实例中运行命令。工作目录设置为项目的输出目录,初始环境继承自父进程。不要使用 SETX,这不会改变环境。使用 SET。使用 PATH 更改路径。
  • 你能解释一下我应该在哪里使用 SET PATH 吗?我在安装 ajax 缩小程序后使用了一次 SETX。我将如何在预构建事件中使用 SET PATH?
  • 把它放在你的预构建事件中:set path=c:\foo\bar;%path%.
  • 刚刚试了一下,效果很好。唯一的问题是我在我的项目文件中对路径进行了硬编码。有什么方法可以设置路径并从已经存在的全局环境路径变量中获取路径(之前由 SETX 设置的那些)
  • 关于如何告诉您停止使用 SETX 的想法已经不多了。它更新注册表,而不是环境。

标签: visual-studio-2010 msbuild cruisecontrol.net pre-build-event


【解决方案1】:

MSBuild 就像任何其他开发工具一样,它可以在启动它的任何用户上下文下运行。

当您通过 Visual Studio 运行 msbuild 时,它会像您一样运行,因为您的登录上下文运行 Visual Studio,而 Visual Studio 又运行构建。

如果您通过某个构建服务运行它,答案将取决于该构建服务的运行方式。例如,TFS Build 以您为 TFS Build 服务的登录凭据配置的任何用户身份启动 MSBuild。如果您已将 CC.NET 配置为作为服务运行,那么您还必须指定它作为哪个用户运行。这也是 MSBuild 的运行方式。

如果您需要为构建设置特定的环境,您有几个选择。最简单的方法,虽然是一种“巨锤”方法,但在构建机器上为所有用户全局配置环境。其他选项包括在构建中运行某种预配置步骤,或编写启动批处理文件以在设置环境后手动启动服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2011-04-12
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多