Я создал обходной путь для этой проблемы. Это работает только на 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 на первоначальное выполнение цели Configure
).
После этого переместите Configure.xslt
и Default.props
в каталог по вашему выбору.
Наконец, используйте следующий шаблон во всех ваших проектах.
<?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 запустите начальный msbuild
, чтобы заполнить ваш файл конфигурациями, иначе VS IDE не откроет ваш проект (из-за той же ошибки, которая изначально спровоцировала этот обходной путь). В качестве альтернативы ваш шаблон может содержать любую фиктивную конфигурацию, просто для того, чтобы в IDE можно было изначально открыть проект - эффект тот же.
Известные предостережения: Вы не можете создавать конфигурации для каждого проекта, используя IDE (поскольку IDE принудительно группирует любые конфигурации, найденные под меткой ProjectConfigurations
). Вы можете создать их непосредственно в XML-данных файла проекта, и, как только вы не пометите их ProjectConfigurations
, они не будут заменены или удалены.