我们有一个大型(~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中修复它的信息?
答案 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}最初的目标)。
之后,将Configure
和Configure.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解决方案使用。在这种情况下我也会生成解决方案文件,因此您不必在两个地方维护项目列表。