Visual Studio 2010无法加载导入<projectconfiguration>元素的项目</projectconfiguration>

时间:2011-04-08 14:11:13

标签: visual-studio-2010 msbuild

我们有一个大型(~800个别项目)系统,我们正在从旧的构建系统迁移到Visual Studio 2010.在过去几周,我们为每个系统手动创建了Visual Studio项目文件(.vcxproj格式)这些项目我们只能使用MSBuild.exe(WIN !!)从命令行构建整个系统。由于需要转换大量项目,因此手动创建项目文件比使用VS项目向导创建项目文件更有效,因为我们之前的构建系统未使用Visual Studio项目文件。

为了维护并遵守DRY,我们将大部分构建配置(编译器/链接器开关,包括路径等)重构为常见的.targets和.props文件。由于每个项目的配置集都相同,我们还将包含<ItemGroup>项的<ProjectConfiguration>放在公共.props文件中,一切都适用于我们无人值守的每晚构建。

不幸的是,Visual Studio 2010 IDE(RTM版本)无法加载这些项目。当我尝试加载项目时,出现错误“Project [Foo]不包含任何配置”。如果我手动将<ItemGroup>从.props文件复制到任何项目中,IDE就可以加载项目。

在搜索时,我在MS Connect上发现了this问题,但它被标记为“已关闭为外部”,MS的回复表明该问题正在针对Visual Studio的下一个公开发布进行调查。手动将完全相同的 <ItemGroup>元素添加到~800个项目中是不可接受的解决方法。由于项目在VS之外构建并且运行完美,因此我必须假设问题与Visual Studio解析/加载项目文件的方式有关。

有没有人能够找到解决此问题的方法?有没有人有关于何时/如果在Visual Studio中修复它的信息?

3 个答案:

答案 0 :(得分:3)

我为此问题创建了一种解决方法。这仅适用于VS2010,而不适用于以前的版本,因为它需要MSBuild 4。

首先,使用以下内容创建名为Configure.xslt的文件。

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msbuild="http://schemas.microsoft.com/developer/msbuild/2003">
  <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="/msbuild:Project">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy-of select="." />
  </xsl:template>
  <xsl:template match="msbuild:ItemGroup[@Label = 'ProjectConfigurations']">
    <xsl:copy-of select="document('Default.props')/msbuild:Project/msbuild:ItemGroup[@Label = 'ProjectConfigurations']" />
  </xsl:template>
</xsl:transform>

现在,使用以下内容创建名为Default.props的文件。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" InitialTargets="Configure" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This must come first, or else VS IDE's property sheets will choke. -->
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

  <!-- The following configurations will be pasted into the importing project file on demand. -->
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>

  <!-- XLST task which manipulates the project file and performs an in-place replacement. -->
  <Target Name="Configure" Condition="Exists('$(MSBuildThisFileDirectory)Configure.xslt')" Inputs="$(MSBuildProjectFile);$(MSBuildThisFileFullPath);$(MSBuildThisFileDirectory)Configure.xslt" Outputs="$(MSBuildProjectFile);$(OutDir)">
    <Message Text="Configuring $(MSBuildProjectFile)..." />
    <XslTransformation XslInputPath="$(MSBuildThisFileDirectory)Configure.xslt" XmlInputPaths="$(MSBuildProjectFile)" OutputPaths="$(MSBuildProjectFile).tmp" />
    <Move SourceFiles="$(MSBuildProjectFile).tmp" DestinationFiles="$(MSBuildProjectFile)" />
    <MakeDir Directories="$(OutDir)" />
  </Target>

  <!-- The remaining MSBuild imports. -->
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

此文件是单独的“属性表”,其中包含项目的所有常用属性,包括配置。根据您的需求进行定制。重要的部分是<Target>节点(创建一个名为Configure的新目标)和InitialTargets节点中的<Project>属性(告诉MSBuild执行{{1}最初的目标)。

之后,将ConfigureConfigure.xslt移动到您选择的目录中。

最后,在所有项目中使用以下模板。

Default.props

在VS提示符下,运行初始<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- Change the directory below according to the path containing the above files. --> <Import Project="Directory\Default.props" /> <!-- The ItemGroup below will be effectively replaced by the same ItemGroup inside Default.props. --> <ItemGroup Label="ProjectConfigurations" /> </Project> 以使用配置填充文件,否则VS IDE将无法打开您的项目(因为首先激发此解决方法的相同错误)。或者,您的模板可能包含任何虚拟配置,只是为了使IDE能够最初打开项目 - 效果是相同的。

已知警告:您无法使用IDE创建每个项目的配置(因为IDE会强制将msbuild标签下找到的任何配置分组)。您可以直接在项目文件的XML数据中创建它们,并且只要您不标记它们ProjectConfigurations,就不会替换或删除它们。

答案 1 :(得分:1)

这在VS2012上是可行的,但是你必须记住导入/初始化变量的顺序非常重要。

你需要很早就在项目文件中,第一项真的。我认为系统.props文件可能需要配置才能正常工作,这就是您收到该错误的原因。我在VS2012上遇到了和你一样的错误,直到我攻击了我的VS项目。

答案 2 :(得分:0)

在这个问题中回答:Is it possible to move configuration definitions into a property sheet with MSBuild?

以下是连接问题,指出这没有进入RTM:https://connect.microsoft.com/VisualStudio/feedback/details/514008/vcxproj-doesnt-examine-imports-to-find-project-configurations-beta-2

除了生成项目之外,我没有找到任何解决方法。一个技巧是将一个sentinal值放在项目文件中,比如说$ {CommonConfigurations},然后使用字符串属性函数替换它,生成全新的项目文件以供VS解决方案使用。在这种情况下我也会生成解决方案文件,因此您不必在两个地方维护项目列表。