2016-11-20 78 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>