2011-10-23 8 views
8

私は、コマンドラインから呼び出されるmsbuildプロジェクトと、プロジェクト内からMSBuildタスクによって呼び出されるものについて、異なる冗長性を持たせたいと思います。たとえば、次のようにmy.projインサイドMSBuildタスクの冗長性を変更するにはどうすればよいですか?

:コマンドラインで

<Target Name=Foo> 
    <MSBuild Projects="a.csproj;b.csproj;c.csproj"/> 
</Target> 

:MSBuildのタスクは.csprojファイルをビルドするとき

msbuild /v:d my.proj 

は今、それは同様に詳細な冗長性とそれをしません。しかし、私は最小限の冗長さでそれを構築したいと思います。

私はそうのような手動のMSBuildを呼び出すことが可能である知っている:

<Target Name=Foo> 
    <Exec Command="msbuild /v:m a.csproj"/> 
    <Exec Command="msbuild /v:m b.csproj"/> 
    <Exec Command="msbuild /v:m c.csproj"/> 
</Target> 

または実際に

<Target Name=Foo> 
    <Exec Command="msbuild /v:m %(Projectlist.Identity)"/> 
</Target> 

と、これはもちろんオフうまく動作しますが、その後、私はBuildInParallelの機能を得ることができませんスイッチをもう使用しないでください(複数のプロジェクトをコマンドラインからmsbuildに呼び出すことはできません)。

更新

私はLudwoのオプションを使用しました。基本的に、2つのConsoleLoggersをメンバーとして保持するカスタムロガーを作成します。 1つはコマンドラインで冗長を渡し、もう1つは 'minimal'です。ロガーはすべてのイベントを登録し、csprojファイルが現在構築されているかどうかに応じてロガーの1つに渡します。出力は、csprojファイルの何千もの行が含まれていない点を除いて、通常と全く同じです。

+0

間の「a.csproj」プロジェクトこのポストScott Hanselmanがあなたを啓発するかもしれない。 http://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx –

+0

+興味深い読書。しかし、私のプロジェクトはソリューションに含まれていないので、 '/ m'スイッチは効果的に並行してプロジェクトを構築するのと同じ効果はありません:順番に構築されます(これを反映するように質問を更新します) – stijn

+0

プロジェクト私たちはMSBuild Sidekickを使って製品階層を構築する方法を理解しました。また、タスクの合理化を支援する見込みがあります。 http://www.attrice.info/msbuild/冗長性が並列性と結びついていることが間違っているようです。 –

答えて

4

あなたは実行のMSBuildを使用して、親スクリプトで

<Target Name="BuildABC"> 
     <MSBuild Projects="a.csproj;b.csproj;c.csproj" BuildInParallel="true"/> 
    </Target> 

ABCプロジェクト "BuildABC.proj" を構築するための一つの追加のMSBuildスクリプトを作成して二つのオプション(少なくとも):)

  1. を持っていますExecタスクと呼び出し "BuildABC.proj"最小限の冗長性

    <Target Name=Foo> 
         <Exec Command="msbuild /v:m /m:2 BuildABC.proj"/> 
        </Target> 
    

    BuildABCプロジェクトに必要なすべての親プロパティをmsbuild/pパラメータに明示的に渡す必要があります。

  2. カスタムロガーを使用します。 See this how to do it。例えばに関連したものを記録していないカスタムロガーで

    <Target Name=Foo> 
        <MSBuild Projects="a.csproj;b.csproj;c.csproj"/> 
    </Target> 
    

    :この場合、あなたはあなたの元のスクリプトを使用することができますProjectStartedと(診断冗長性を持つ親プロジェクトを構築しながら、「a.csproj」プロジェクトの診断ログを無効にする)e.ProjectFile ==「a.csproj」イベントをProjectFinished

+0

はい、私はすでにこのアプローチを試みただけでなく、同じbuildscript(例えばparent.projビルドスクリプトのすべてのプロパティは利用できません。これは動作しますが、メジャーデメリットが1つあります: '明示的に渡されない限り、私はPITAとなるでしょう。多くのプロパティがあるときにプラスになります。追加するたびに、2つの場所に追加する必要があります。 – stijn

+0

私は自分の答えを更新しました) – Ludwo

+0

ありがとう!私は時間があるときカスタムロガーソリューションを見てみましょう、それは有望に見えます。 – stijn

関連する問題