2012-01-06 32 views
2

多個項目必須建立一個或多個配置(調試/發佈/ ...)。如何使用MSBuild爲每個項目每個構建配置提供不同的OutputPath?

構建的輸出需要被複制到文件夾(BuildOutputPath)。 有一個默認的BuildOutputFolder,但對於某些項目,您可以指出輸出需要放在額外的子文件夾中。

例如:

配置爲: - 調試 - 釋放

的項目有:

  • PROJECT1(BuildOutputFolder)
  • Project2的(BuildOutputFolder)
  • 項目3( 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項目文件中完成此操作?

回答

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> 
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)" /> 
+0

我試過了,但我把項目的元數據中的MSBuild屬性的那一刻,%ConfigList.Identity被忽略。 – Linefeed 2012-01-09 07:42:09

相關問題