【问题标题】:MSbuild task fails because "Any CPU" solution is built out of orderMSbuild 任务失败,因为“任何 CPU”解决方案是乱序构建的
【发布时间】:2009-03-27 01:16:45
【问题描述】:

我在 Teambuild 中构建了两种解决方案,一种是应用程序本身,另一种是 WiX 安装程序。我想使用“Any CPU”构建配置和安装程序使用“x86”构建应用程序。我在项目文件中首先列出了“Any CPU”解决方案,但 Teambuild 始终首先构建“x86”解决方案。

我正在设置 BuildSolutionsInParallel = false,但它仍会按相反列出的顺序构建解决方案。如果我将第一个解决方案更改为“混合平台”,它可以正常工作。如何按照项目文件中列出的顺序构建解决方案?

<Project ...>
<PropertyGroup>
  <!-- We want to build the install solution after the build solution -->
  <BuildSolutionsInParallel>false</BuildSolutionsInParallel>
</PropertyGroup>

<ItemGroup>
  <SolutionToBuild Include="$(BuildProjectFolderPath)/Pricer/Pricer.sln">
    <Targets></Targets>
    <Properties></Properties>
  </SolutionToBuild>
  <SolutionToBuild Include="$(BuildProjectFolderPath)/Pricer/Pricer.Install/Pricer.Install.sln">
    <Targets></Targets>
    <Properties></Properties>
  </SolutionToBuild>
</ItemGroup>

  <ItemGroup>
    <ConfigurationToBuild Include="Release|Any CPU">
      <FlavorToBuild>Release</FlavorToBuild>
      <PlatformToBuild>Any CPU</PlatformToBuild>
    </ConfigurationToBuild>
    <ConfigurationToBuild Include="Release|x86">
      <FlavorToBuild>Release</FlavorToBuild>
      <PlatformToBuild>x86</PlatformToBuild>
    </ConfigurationToBuild>
  </ItemGroup>
</Project>

【问题讨论】:

    标签: msbuild tfsbuild


    【解决方案1】:

    这里的问题是,按照惯例,任何 CPU 的处理方式与其他配置略有不同 - 例如,它被排除在输出目录层次结构之外。然后,在 Team Build 目标文件中,有一个名为 ComputeConfigurationList 的目标:

    <ItemGroup>
      <!-- ConfigurationList for any Platform but Any CPU -->
      <ConfigurationList Condition=" '%(ConfigurationToBuild.PlatformToBuild)' != 'Any CPU' " Include="$(MSBuildProjectFile)">
        <Properties>Configuration=%(ConfigurationToBuild.FlavorToBuild);Platform=%(ConfigurationToBuild.PlatformToBuild);TeamBuildOutDir=$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\;TeamBuildPublishDir=$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\</Properties>
      </ConfigurationList>
      <!-- ConfigurationList for Any CPU Platform -->
      <ConfigurationList Condition=" '%(ConfigurationToBuild.PlatformToBuild)' == 'Any CPU' " Include="$(MSBuildProjectFile)">
        <Properties>Configuration=%(ConfigurationToBuild.FlavorToBuild);Platform=%(ConfigurationToBuild.PlatformToBuild);TeamBuildOutDir=$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\;TeamBuildPublishDir=$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\</Properties>
      </ConfigurationList>
    </ItemGroup>
    

    此目标分两批处理传入的 ConfigurationToBuild 项目组 - 任何 CPU 和其他所有内容。因此,生成的 ConfigurationList 项组的排序方式与原始 ConfigurationToBuild 项组不同,所有 Any CPU 配置都排在所有 non Any CPU 配置之后。

    如果您的配置顺序很重要,解决方法是为您的所有解决方案定义一个新的解决方案配置 - 有关此说明,请参阅上面引用的博客文章。例如,您可以定义一个名为 TFS 的配置,该配置基于 Any CPU 用于您的 Any CPU 解决方案,基于 Win32 用于这些解决方案等。然后在您的 TfsBuild.proj 文件中,您将只在您的 ConfigurationToBuild 项目组中包含这个配置。当 TFS Build 尝试为 Any CPU 构建 Win32 配置时,这将产生摆脱各种“无效配置”警告的良好副作用,反之亦然。

    【讨论】:

      【解决方案2】:

      可以为属于同一解决方案的项目设置项目构建顺序。在这种情况下,由于不相关的原因,项目需要属于 2 个不同的解决方案。

      I've discovered here“混合平台”解决方案中的 C# 项目将构建为“任何 CPU”,因此解决方案是始终在 Teambuild 项目文件中使用“混合平台”。

      【讨论】:

        【解决方案3】:

        好的,我不确定它是否与 Teambuild 相同,但是通过“项目 -> 项目构建顺序”设置项目的构建顺序怎么样?

        【讨论】:

          【解决方案4】:

          我刚刚发布了一个类似的问题,因为它似乎是同一个问题,但与 AnyCPU 没有任何关系。这个问题解决了吗?

          Why does Tfs2010 build my Wix project before anything else?

          【讨论】:

            猜你喜欢
            • 2010-10-03
            • 1970-01-01
            • 2010-12-11
            • 1970-01-01
            • 1970-01-01
            • 2011-06-06
            • 2012-03-18
            • 1970-01-01
            相关资源
            最近更新 更多