3

我在 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

4 回答 4

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 项组不同,所有 Any CPU 配置都排在所有Any CPU 配置之后。

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

于 2009-07-23T12:09:40.833 回答
2

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

我在这里发现“混合平台”解决方案中的 C# 项目将构建为“任何 CPU”,因此解决方案是始终在 Teambuild 项目文件中使用“混合平台”。

于 2009-05-11T07:07:55.960 回答
0

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

为什么 Tfs2010 会先构建我的 Wix 项目?

于 2010-04-16T22:18:14.897 回答
0

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

于 2009-05-07T04:47:16.113 回答