Как задать разные выходные значения для каждого проекта для каждой конфигурации сборки с помощью MSBuild? - PullRequest
2 голосов
/ 06 января 2012

Необходимо построить несколько проектов с одной или несколькими конфигурациями (отладка / выпуск /...).

Вывод сборки необходимо скопировать в папку (BuildOutputPath). Существует BuildOutputFolder по умолчанию, но для некоторых проектов вы можете указать, что вывод нужно поместить в дополнительную дочернюю папку.

Например:

Конфигурация: - отладка - выпуск

Проекты:

  • Project1 (BuildOutputFolder)
  • Project2 (BuildOutputFolder)
  • Project3 (BuildOutputFolder \ Child)

Конечный результат должен выглядеть следующим образом:

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

Я получил это далеко, но не могу понять, как переопределить 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?

Ответы [ 2 ]

1 голос
/ 16 января 2012

Вы пытаетесь рекурсивно вызывать задачу в двух разных контекстах. Для 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>
0 голосов
/ 07 января 2012

Попробуйте сделать это, используя метаданные проекта

<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)" />
...