2016-11-20 81 views
0

我想为所有具有属性的项目文件调用msbuild任务。我使用硬编码配置和平台组合来四次调用msbuild任务。喜欢的东西将属性传递给MSBUILD任务

<MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" Properties="Configuration=Debug;Platform=Win32" BuildInParallel="true"/> 
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" Properties="Configuration=Debug;Platform=x64" BuildInParallel="true"/> 
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" Properties="Configuration=Release;Platform=Win32" BuildInParallel="true"/> 
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" Properties="Configuration=Release;Platform=x64" BuildInParallel="true"/> 

但我想提供这种财产的ItemGroup像这样

Configuration=%(BUILD_CONFIG.Identity);Platform=%(BUILD_PLATFORM.Identity) 

代码示例 MyProject.vcxproj

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="BuildAll" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<Import Project="BuildAllConfiguration.vcxproj"/> 
<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> 
    <ProjectConfiguration Include="Debug|x64"> 
     <Configuration>Debug</Configuration> 
     <Platform>x64</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Release|x64"> 
     <Configuration>Release</Configuration> 
     <Platform>x64</Platform> 
    </ProjectConfiguration> 
    </ItemGroup> 
    <PropertyGroup Label="Globals"> 
    <ProjectGuid>{E6B6F967-3BE3-428F-9288-3F838B8E726A}</ProjectGuid> 
    <Keyword>Win32Proj</Keyword> 
    <RootNamespace>MyProject</RootNamespace> 
    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> 
    </PropertyGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> 
    <ConfigurationType>DynamicLibrary</ConfigurationType> 
    <UseDebugLibraries>true</UseDebugLibraries> 
    <PlatformToolset>v140</PlatformToolset> 
    <CharacterSet>Unicode</CharacterSet> 
    </PropertyGroup> 
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
    <ClCompile> 
     <PrecompiledHeader> 
     </PrecompiledHeader> 
     <WarningLevel>Level3</WarningLevel> 
     <Optimization>Disabled</Optimization> 
     <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <SDLCheck>true</SDLCheck> 
    </ClCompile> 
    <Link> 
     <SubSystem>Windows</SubSystem> 
     <GenerateDebugInformation>true</GenerateDebugInformation> 
    </Link> 
    </ItemDefinitionGroup> 
... 
Similar Configuration Details for release and Platforms x64 

该项目文件包括BuildAllConfiguration.vcxproj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <BUILD_PLATFORMS>Win32;x64</BUILD_PLATFORMS> 
    <BUILD_CONFIGURATION>Debug;Release</BUILD_CONFIGURATION> 
    </PropertyGroup> 
    <Target Name="BuildAll"> 
    <ItemGroup>  
     <CONFIGURATION Include="$(BUILD_CONFIGURATION.Split(';'))"/> 
     <PLATFORM Include="$(BUILD_PLATFORMS.Split(';'))"/> 
     <ProjectToBuild Include="$(MSBuildProjectFile)"> 
     <Properties>Configuration=%(CONFIGURATION.Identity);Platform=%(PLATFORM.Identity)</Properties> 
     <Targets>Build</Targets> 
     </ProjectToBuild> 
    </ItemGroup> 
    <Message Text="MSBUILD TASK input @(ProjectToBuild)"/> 
    <MSBuild Projects="@(ProjectToBuild)" /> 
</Target> 
</Project> 

该项目将调用MyProject.vcxproj目标生成和属性,这是不正确的。我的期望是,性质变为如下

Properties=Configuration=Debug;Platform=Win32 
Properties=Configuration=Release;Platform=Win32 
Properties=Configuration=Debug;Platform=x64 
Properties=Configuration=Release;Platform=x64 

相反的特性如下

Properties=Configuration=Debug;Platform= 
Properties=Configuration=Release;Platform= 
Properties=Configuration=;Platform=Win32 
Properties=Configuration=;Platform=x64 

回答

0

您这里需要一个跨产品,如果你搜索,你会发现很多answers过去了,尽管我认为如果你不知道它被称为可能很难找到。这样的事情:

<Target Name="BuildAll"> 
    <ItemGroup> 
    <CONFIGURATION Include="$(BUILD_CONFIGURATION.Split(';'))"/> 
    <PLATFORM Include="$(BUILD_PLATFORMS.Split(';'))"/> 

    <!-- cross product of both --> 
    <ConfigAndPlatform Include="@(CONFIGURATION)"> 
     <Platform>%(PLATFORM.Identity)</Platform> 
    </ConfigAndPlatform> 

    <ProjectToBuild Include="$(MSBuildProjectFile)"/> 
    </ItemGroup> 
    <MSBuild Projects="@(ProjectToBuild)" Properties="Configuration=%(ConfigAndPlatform.Identity);Platform=%(ConfigAndPlatform.Platform)" /> 
</Target> 

一些注意事项:首都使事情更难阅读,也许不使用它们?此外,如果您将配置/平台放置在ItemGroup而不是PropertyGroup中,则不需要额外的分割逻辑:

<ItemGroup> 
    <Configuration Include="Debug;Release"/> 
    <Platform Include="Win32;x64"/> 
<ItemGroup>