【问题标题】:Specifying Tf.exe and MsBuild version in CC.Net在 CC.Net 中指定 Tf.exe 和 MsBuild 版本
【发布时间】:2011-08-18 19:28:33
【问题描述】:

问题

我正在将构建移植到 CC.Net 的较新版本(从 1.4.4 到最近的 1.6 版本)。以前的构建混合了<msbuild /> 标记和<exec /> 标记,这些标记调用批处理文件,其中包含tf.exe 命令。

构建必须依赖于msbuildtf.exe 命令之间相同的源代码控制版本,因为现在我在tf.exe 命令上收到错误:

无法确定工作区。

当我启动命令提示符时,使用 runas 作为服务使用的同一用户,并调用批处理文件使用的同一命令(来自同一目录),我得到同样的错误。

但是,如果我使用 runas 启动 Visual Studio 2010 命令提示符并调用该命令(从同一目录),我不会收到错误消息。

这也是有道理的,因为%UserProfile%\Local Settings\Application Data\Microsoft\Team Foundation\3.0\Cache\VersionControl.config 文件有工作区映射,而...\1.0\Cache\VersionControl.config 文件没有。

我想尝试的解决方案

我不能简单地更改批处理文件的 PATH,因为由于许可,它实际上需要针对旧版本的 Visual Studio 构建。

我想我可以通过指定与<msbuild /> 标签一起使用的 TFS/msbuild 版本来解决这个问题。但我不知道该怎么做。我认为这将是某种服务器配置,但我在文档中没有找到任何关于此的内容。

我的问题是:如何指定 Cruise Control 用于<msbuild /> 标签的 TFS 版本?还是有其他方法可以解决这个问题?

【问题讨论】:

    标签: tfs msbuild cruisecontrol.net


    【解决方案1】:

    据我所知,没有办法直接用 msbuild 指定。在我们这里解决的方法是,我们将 msbuild 的可执行文件设置为一个 bat 文件,该文件基本上是所需 vcvars-script 的副本(由 Visual Studio 命令提示符用于设置环境)。

    <tasks>
          <msbuild>
            <executable>vcvars_VC10_amd64.bat</executable>
            <workingDirectory>SomeFolder</workingDirectory>
            <environment>
                <variable name="foo" value="bar" />
            </environment>
            <projectFile>msbuild.proj</projectFile>
            <buildArgs>/m:2  /p:Configuration=Release /p:Platform=x64 /v:normal</buildArgs>
            <targets>Clean;Build;Test</targets>
            <timeout>3600</timeout>
          </msbuild>
      </tasks>
    

    也许您也可以使用 &lt;environment&gt; 属性设置您想要的路径。

    【讨论】:

    • vcvars 解决方案听起来很有希望。它适用于任一种任务类型。您是否有方便的方法来获取现有文件的路径,或者您只是通过手动过程将文件复制到工作文件夹?
    • 发现我可以找到 vcvars 批处理文件:"$(Vs80ComnTools)\..\..\VC\vcvarsall.bat"executable 元素也很有帮助,可以在sourcecontrol 元素中使用。
    【解决方案2】:

    我不会接受这个解决方案,以防人们有其他解决方案(或者可以解决我直接询问的问题),但这是我最终解决问题的方式:

    我在构建任务的顶部添加了一个工作区同步任务:

    <tasks>
        <exec>
            <description>Sync the workspaces with the TFS server, for the version of TFS used in exec commands</description>
            <executable>Tf.exe</executable>
            <buildArgs>workspaces /s:$(TfsServer)</buildArgs>
        </exec>
    

    这是可行的,因为在我的场景中,我并不关心版本控制,而是关心工作区不同步。

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多