2012-01-06 42 views
2

1つ以上の設定(debug/release/...)で複数のプロジェクトをビルドする必要があります。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 

私はこれまで、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プロジェクトファイルでどのように達成できますか?

答えて

1

Your'eをプロジェクトメタデータを使用してそれを行うようにしてください。 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

関連する問題