使用MSBuild生成多个配置 [英] Using MSBuild to Build Multiple Configurations
问题描述
我正在尝试编辑我的项目文件,以使我拥有一个可以一次构建多个构建配置的项目.我已经使用批处理方法和MSBuild任务完成了此操作(请参见下文).
I'm trying to edit my project file to enable me to have a project that builds multiple build configs at once. I've done this using a batching approach and using the MSBuild task (see below).
如果运行脚本,则会出现此错误:
If I run the script, I get an this error:
错误103 OutputPath属性是 没有为项目设置 "ThisMSBuildProjectFile.csproj". 请检查以确保您 指定了以下内容的有效组合 为此的配置和平台 项目.配置='调试' Platform ='AnyCPU'.
Error 103 The OutputPath property is not set for project "ThisMSBuildProjectFile.csproj". Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='AnyCPU'.
如果我从MSBuild任务添加或省略OutputPath,则会得到此信息.如果使用VS2010调试器来逐步执行脚本并调用MSBuild任务-调试器将再次进入该文件,然后进入OutputPath,所以afaik,它应该拾取该值,不是吗?
I get this if I add or omit the OutputPath from the MSBuild task. If used the VS2010 debugger to step through the script and the MSBuild Task is called - the debugger steps into the file again and then steps into OutputPath, so afaik, it should pick that value up, no?
对此的任何帮助将不胜感激-这使我发疯.谢谢保罗.
Any help for this would be greatly appreciated - it's driving me crazy. Thanks, Paul.
ThisMSBuildProjectFile.csproj(取出多余的东西):
ThisMSBuildProjectFile.csproj (surplus stuff taken out):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- Only Import normal targets if not building multiple projects -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition="'$(Configuration)|$(Platform)' != 'AllBuild|AnyCPU' "/>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>C:\Folder\Etc\Output\$(Configuration)\</OutputPath>
<OutDir>C:\Folder\Etc\Output\$(Configuration)\</OutDir>
<BaseOutputPath>C:\Folder\Etc\Output\$(Configuration)\</BaseOutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<!-- Common -->
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<Platform>AnyCPU</Platform>
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<ItemGroup>
<Projects Include="C:\Folder\Etc\ThisMSBuildProjectFile.csproj" />
</ItemGroup>
<!-- Call this project file again, but with a different configuration - if this was working, this would call multiple build configs -->
<Target Name="Build" Condition="'$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' ">
<Message Text="hm!"/>
<!-- Tried thiswith and without the OutputPath property - makes no difference. -->
<MSBuild Projects="@(Projects)" Properties="Configuration=Debug;OutputPath=C:\Folder\Etc\Output\" ToolsVersion="4.0" Condition="'$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' "/>
</Target>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<!-- Project files -->
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Blah\Blah.cs" />
</ItemGroup>
推荐答案
重要的是要意识到,当您使用"MSBuild"任务时,将启动一个新的子MSBuild进程.这意味着您在父MSBuild流程中定义的所有项目和属性将不会自动传递给子MSBuild流程/从子MSBuild流程可见除非您明确地通过以下方式传递它们: MSBuild
元素上的Properties
属性(如<MSbuild Properties="..." />
中一样).
It is important to realize that when you use a "MSBuild" task, a new child MSBuild process will be started. The implication of this is that any items and properties you define in the parent MSBuild process will not be automatically passed to/visible from the child MSBuild process unless you explicitely pass them via Properties
attribute on MSBuild
element (as in <MSbuild Properties="..." />
).
为回答您的问题,我编写了以下独立的示例,该示例针对所有指定的配置运行子MSBuild项目:
To answer your question, I wrote the following self-contained example that runs a child MSBuild project for all the specified configurations:
-
首先,为您的MSBuild实验创建一个目录(例如,我使用
C:\temp\msbuildtest
)
在此目录中,创建第一个文件main.proj
:
In this directory, create the first file, main.proj
:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<ItemGroup>
<ConfigList Condition=" '@(ConfigList)' == '' and $(Config) != '' " Include="$(Config.Split('+'))" /><!-- parse all requested configurations into a list -->
<ConfigList Condition=" '@(ConfigList)' == '' " Include="Debug" /><!-- if no configurations were specified, default to Debug -->
</ItemGroup>
<!--
Build the child project for each requested configuration. -->
<Target Name="Build">
<MSBuild Projects="$(MSBuildProjectDirectory)\child.proj" Properties="Configuration=%(ConfigList.Identity);OutputPath=$(MSBuildProjectDirectory)\bin\%(ConfigList.Identity)" Targets="Build" />
</Target>
</Project>
在同一目录中,创建第二个文件child.proj
(在您的情况下,这将是您要构建的实际C#项目,但是由于我试图说明我的观点,所以我使用一个简单的子项目,而不是运行C#编译器,而只是打印属性值:-))
In the same directory, create the second file, child.proj
(in your case this would be the actual C# project you're trying to build, but because I'm trying to illustrate my point, I am using a simple child project that instead of running C# compiler just prints values of properties :-) )
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<Target Name="Build">
<Message Text="Building configuration $(Configuration) with output path $(OutputPath)" Importance="High" />
</Target>
</Project>
现在您可以运行该示例.首先是默认值,如果您未明确指定要配置的配置:
Now you can run the example. First the default, if you don't explicitly specify configurations to build:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild main.proj
> (cut the noise)
> Build:
> Building configuration Debug with output path C:\temp_c\d\bin\Debug
然后显式指定多个配置:
And then explicitly specified multiple configurations:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild main.proj /property:Config=Debug+Release+Staging+Production
> (cut the noise)
> Build:
> Building configuration Debug with output path C:\temp_c\d\bin\Debug
> Build:
> Building configuration Release with output path C:\temp_c\d\bin\Release
> Build:
> Building configuration Staging with output path C:\temp_c\d\bin\Staging
> Build:
> Building configuration Production with output path C:\temp_c\d\bin\Production
您应该能够使这种技术适应您的情况.
You should be able to adapt this technique to your situation.
这篇关于使用MSBuild生成多个配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!