将属性传递给 MSBUILD 任务
Passing properties to MSBUILD Task
我正在尝试为所有具有属性的项目文件调用 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
这里需要一个叉积,如果您搜索它,您应该会找到很多 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>
一些注意事项:大写字母使事情更难阅读,也许不要使用它们?此外,如果您将 configurations/platforms 放在 ItemGroup 而不是 PropertyGroup 中,则不需要额外的拆分逻辑:
<ItemGroup>
<Configuration Include="Debug;Release"/>
<Platform Include="Win32;x64"/>
<ItemGroup>
我正在尝试为所有具有属性的项目文件调用 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
这里需要一个叉积,如果您搜索它,您应该会找到很多 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>
一些注意事项:大写字母使事情更难阅读,也许不要使用它们?此外,如果您将 configurations/platforms 放在 ItemGroup 而不是 PropertyGroup 中,则不需要额外的拆分逻辑:
<ItemGroup>
<Configuration Include="Debug;Release"/>
<Platform Include="Win32;x64"/>
<ItemGroup>