MSbuild任务失败,因为“任何CPU”解决方案是无序构建的

时间:2009-03-27 01:16:45

标签: msbuild team-build

我有两个在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>

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这里的问题是,按照惯例,任何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项目组不同,所有任何CPU配置都在所有任何CPU配置之后。

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

答案 2 :(得分:0)

好的,我不确定它是否与Teambuild相同但是如何通过“Project - &gt; Project Build Order”设置项目的构建顺序?

答案 3 :(得分:0)

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

Why does Tfs2010 build my Wix project before anything else?