【问题标题】:How to execute a MSBuild copy operation only on the build machine?如何仅在构建机器上执行 MSBuild 复制操作?
【发布时间】:2010-06-29 15:03:58
【问题描述】:

我想在构建机器上执行一些复制操作(而不是在开发机器上)

  • 执行构建之后
  • 集成测试运行之前。

我该怎么做?

也许,我应该把问题分解成子问题并举一些例子。

问题 1:我需要做什么才能使 MSBuild 脚本检测到它正在构建机器上执行并因此执行复制操作?我是否调整 *.csproj 文件?我是否在构建定义文件中做某事?构建服务器是我们 TFS 2010 后端的一部分。

问题 2:我需要使用什么变量来引用构建机器上的构建文件夹?绝对路径是

C:\Builds\1\ProjectX\Continous Integration\

我需要将一些受版本控制并最终在 Sources 文件夹中的文件复制到 Binaries 文件夹。

C:\Builds\1\ProjectX\Continous Integration\Binaries
C:\Builds\1\ProjectX\Continous Integration\Sources
C:\Builds\1\ProjectX\Continous Integration\TestResults

【问题讨论】:

    标签: msbuild build-automation msbuild-4.0


    【解决方案1】:

    无论您使用什么自动化构建,都应该能够将属性传递给 MSBuild。在命令行上,您可以执行以下操作:

    msbuild my.proj /p:RunningOnBuildMachine=true
    

    然后,您可以在您的脚本中使用基于$(RunningOnBuildMachine) == 'true' 的条件来触发临时步骤。或者,已经有一个内置变量 $(BuildingInsideVisualStudio) 告诉 MSBuild 是否从 VS 中调用它,这可能足以满足您的需求。

    至于你的输出目录在哪里,这有点棘手。是什么决定了那个位置?是 CI 服务器吗?如果是这样,您也可以尝试将输出目录作为属性传递给脚本。

    【讨论】:

    • 我不确定输出目录位置决定了什么。我们有一个 TFS 2010 实例和一个构建服务器。我想输出位置是在 Team Explorer view > ProjectX > Builds > "Continuous Integration" > Edit Build Definition > Workspace > Build Agent Folder = $(SourceDir)... 我想我可以使用 $(SourceDir) from MSBuild 脚本。
    【解决方案2】:

    如果您使用的是使用 Windows Workflow Foundation 的默认构建过程模板 (DefaultTemplate.xaml),而不是使用 MSBuild 的升级模板,那么您可以使用开箱即用的 CopyDirectory 工作流活动并将其放在工作流的编译部分和测试部分。

    您在 TFS 2010 中使用的是哪个构建过程模板?

    【讨论】:

    • 很好的提示,谢谢!是的,我们使用的是默认构建过程模板 DefaultTemplate.xaml。我会尝试在正确的位置添加 CopyDirectory 工作流活动。
    • 太棒了 - 我现在真的是 Team Build 2010 中 Windows Workflow Foundation 的忠实粉丝。
    【解决方案3】:

    构建文件夹:

    您是否尝试过 MSBuild 保留属性 MSBuildProjectDirectory

    您可以像访问其他属性一样访问它,例如$(MSBuildProjectDirectory)\Binaries。还是你的意思是别的?

    【讨论】:

      【解决方案4】:

      如果您对工作流程感到满意,您可以按照 Ed 已经指定的那样操作现有的工作流程。 如果您希望它成为构建过程的一部分,以便您可以准备一个最终可以与 msdeploy 一起使用的包,您可以将其放入您的 msbuild 脚本中。

      1) 假设你有一个web项目文件要构建,你可以创建一个与项目文件同名的msbuild脚本,扩展名为wpp.targets;它将被构建过程拾取,例如如果您的项目名为 mywebproject.csprj,则新脚本将名为 mywebproject.wpp.targets。在那里你可以让你的目标在特定的构建目标之后运行。关于房产,您有很多选择。保罗的例子很好。我通常定义一个默认的空属性,我用构建参数覆盖它,或者修改工作流以覆盖该属性。在使用 Visual Studio 进行常规构建时,我的参数将为空,我可以将其用作某些目标的条件。

      2) 当我想在 msdeploy 包中包含其他文件时,我经常使用 $(ProjectDir) 和 $(_PackageTempDir)。 $(ProjectDir) 也适用于您。它指向构建服务器上项目文件所在的文件夹。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多