MSbuild任务失败,因为“Any CPU”解决方案构建顺序错误。

3

我有两个解决方案要在Teambuild中建立,一个是应用程序本身,另一个是使用WiX安装程序。我想使用“Any CPU”编译配置来构建应用程序,使用“x86”来构建安装程序。我已经在项目文件中将“Any CPU”解决方案列在第一位,但是Teambuild总是先构建“x86”解决方案。

我设置了BuildSolutionsInParallel = false,但它仍然按相反的顺序构建解决方案。如果我将第一个解决方案改为“Mixed Platform”,那么就能正常工作。我该如何按照项目文件中列出的顺序构建解决方案?

<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个回答

2
“项目构建顺序”可以为同一解决方案中的项目设置。但在某些不相关的情况下,这些项目需要属于两个不同的解决方案。
我在这里发现,在“混合平台”解决方案中的 C# 项目将会生成为“任何 CPU”,因此解决方案是始终在 Teambuild 项目文件中使用“混合平台”。

2
这里的问题在于,按约定惯例,Any 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 项组分为两批 - Any CPU 和其他所有内容。因此,生成的 ConfigurationList 项组与原始的 ConfigurationToBuild 项组排序不同,所有 Any CPU 配置都在所有非 Any CPU 配置之后。

如果您的配置顺序很重要,则可以通过为所有解决方案定义一个新的解决方案配置来解决问题 - 有关说明,请参见上面引用的博客文章。例如,您可以为您的 Any CPU 解决方案定义一个名为 TFS 的配置,并基于 Win32 为这些解决方案等定义配置。然后在您的 TfsBuild.proj 文件中,您只需要在 ConfigurationToBuild 项组中包含此一个配置即可。这将带来一个好处,即消除您在 TFS Build 尝试构建 Any CPU 和 Win32 配置时可能遇到的各种“无效配置”警告。


0

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接