2

必须使用一种或多种配置(调试/发布/...)构建多个项目。

需要将构建的输出复制到一个文件夹 (BuildOutputPath)。有一个默认的 BuildOutputFolder,但对于某些项目,您可以指示输出需要放在一个额外的子文件夹中。

例如:

配置有:--debug--release

这些项目是:

  • 项目 1(构建输出文件夹)
  • 项目 2(构建输出文件夹)
  • Project3 (BuildOutputFolder\Child)

最终结果应如下所示:

\\BuildOutput\
     debug\
         project1.dll
         project2.dll
         Child\
               Project3.dll
     release\
         project1.dll
         project2.dll
         Child\
              Project3.dll

我得到了这么远的atm,但无法弄清楚如何覆盖每个项目的OutputPath。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build" >
  <ItemGroup>
    <ConfigList Include="Debug" />
    <ConfigList Include="Release" />
   </ItemGroup>  

  <PropertyGroup>
    <BuildOutputPath>$(MSBuildProjectDirectory)\BuildOutput\</BuildOutputPath>
  </PropertyGroup>

  <ItemGroup>
    <Projects Include="project1.csproj" />
    <Projects Include="project2.csproj" />
    <Projects Include="project3.csproj" />
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Projects)"
             BuildInParallel="true"
             Properties="Configuration=%(ConfigList.Identity);OutputPath=$(BuildOutputPath)%(ConfigList.Identity)" />

  </Target>
</Project>

您将如何在 MSBuild 项目文件中完成此操作?

4

2 回答 2

1

您试图在两种不同的上下文中递归调用任务。2 个配置和 3 个项目需要 6 次调用构建任务。您需要以这样一种方式布局项目,即ConfigList调用中的每个项目乘以Projects.

还使用ItemDefinitionGroup设置默认共享属性:

  <ItemGroup>
    <ConfigList Include="Debug" />
    <ConfigList Include="Release" />
  </ItemGroup>

   <ItemDefinitionGroup>
    <Projects>
      <BuildOutputPath>$(MSBuildProjectDirectory)\BuildOutput\</BuildOutputPath>
    </Projects>
  </ItemDefinitionGroup>

  <ItemGroup>
    <Projects Include="project1.csproj" />
    <Projects Include="project2.csproj" />
    <Projects Include="project3.csproj" >
      <Subfolder>Child</Subfolder>
    </Projects>
  </ItemGroup>

  <Target Name="Build">

    <MSBuild Projects="$(MSBuildProjectFullPath)"
             Targets="_BuildSingleConfiguration"
             Properties="Configuration=%(ConfigList.Identity)" />

  </Target>

  <Target Name="_BuildSingleConfiguration">

    <MSBuild Projects="@(Projects)"
             BuildInParallel="true"
             Properties="Configuration=$(Configuration);OutputPath=%(Projects.BuildOutputPath)$(Configuration)\%(Projects.Subfolder)" />
  </Target>

</Project>
于 2012-01-16T15:09:30.620 回答
0

尝试使用项目元数据来做到这一点

<ItemGroup>
    <Projects Include="project1.csproj">
       <ChildFolder/>
    </Project>
    <Projects Include="project2.csproj">
       <ChildFolder/>
    </Project>
    <Projects Include="project3.csproj">
       <ChildFolder>Child</ChildFolder>
    </Project>
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Projects)"
         BuildInParallel="true"
         Properties="Configuration=%(ConfigList.Identity);OutputPath=$(BuildOutputPath)%(ConfigList.Identity)%(Project.ChildFolder)" />
于 2012-01-06T20:11:56.910 回答