2012-08-27 18 views
10

プロジェクトBに依存するプロジェクトAを持っています。プロジェクトAには、プロジェクトBから生成されたいくつかのファイルに依存するビルド前タスクがいくつかあります。 Visual Studio、問題ありません。 MSBuild.exeを使用する場合には、問題があるビルド順序があるので、しかし:MSbuildのビルドオーダーの問題 - ビルド前のステップを最初または従属のプロジェクトの最初に実行する

  • Aの事前ビルドは<ステップ - 実行されると予想 - Bは
  • Bが<をコンパイルされてコンパイルされていなかったために失敗しました最初
  • Aがコンパイルされる

それはMSBuildのを使用して予想される動作ですか? Aのビルド前にMSBuildにBを先に実行させる方法はありますか?

私はVS2010 C#とC++/CLIを使用しています。追加情報をofferesが、ここで、呼び出された方法であれば、私は考えていない:

Running process (C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBUILD.exe "..\..\..\dev\build\MyProj.sln" /t:Clean /p:Configuration=Release;Platform=Win32) 
+0

'PreBuildEventは:' Visual Studioで私の出力ウィンドウに実行見ることができる前に'Csc.exe'を呼び出してください。それに基づいて、私はその質問を理解していません。 –

+0

わかりませんが、あなたの問題はhttp://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exeに似ています.aspx? –

+0

@ P.Brian.Mackey Building VSソリューションとMSBuild.exeは独立したプロセスです。 –

答えて

8

短い答え

をビルドイベントを削除し、プロジェクトに以下のような記述を追加(.csproj) :あなたがcustomiについて読むことができます

<Target Name="AfterResolveReferences"> 
    <Exec Command="echo helloworld" /> 
</Target> 

詳細情報

http://msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

Before BuildイベントはResolveReferencesよりも前に起動されるため、プロジェクトのBeforeBuildイベントを参照するプロジェクトがまだビルドされていない場合、BeforeBuildイベントは失敗します。

これを解決するには、別のエントリポイントを使用してビルドプロセスをカスタマイズする必要があります。上記の例では、AfterResolveReferencesを使用しています。これは、参照するすべてのプロジェクトが既に構築されていることを保証するためです。

6

ジャックの回答はうまくいっているようですが、私が気に入らなかったのは、.csprojを編集するサポートがVS UIでネイティブにサポートされていないことです。 "プロジェクトのアンロード、プロジェクトの編集通常どおりにファイルをクリックすることはできません)、プロジェクトを再読み込みします。 私が望んでいたのは、ビルド前のイベントが、従属プロジェクトをビルドした後にトリガし、MSBuildと同じVSで同じ作業を行うことでした。 この問題に苦しんで、私はMSBuild 4.0で私のために働く解決策を見つけました。

私が何を試しても、依存プロジェクトが完成した後で、PreBuildEventsターゲットをトリガーするように変更できませんでした。だから私が何をしたかの代わりに はPreBuildEventsターゲットを無効にし、適切な時期に実行しますbastardizedカスタムPreBuildEventsターゲットを作成することでした。

<ItemGroup> 
    <ProjectReference Include="..\YourProjectPath\YourProject.csproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </ProjectReference> 
</ItemGroup> 
<Target Name="PreBuildEvent" AfterTargets="" BeforeTargets="" /> 
<Target Name="BastardPreBuildEvent" AfterTargets="ResolveReferences" BeforeTargets="CoreResGen"> 
    <Exec Command="$(PreBuildEvent)" /> 
</Target> 
+1

これは私のために働く。私は同意します...これはVisual Studio PreBuildエディタダイアログをまだサポートしているので、これははるかに優れています。 –

+0

これは、 "AfterTargets =" "BeforeTargets =" 'PreBuildEventが以前の場所で実行されないようにするか、サブ要素のないを持っているという事実ですか? – user145400

+0

おそらく、AfterTargetsとBeforeTargetsを空白に設定すると、 PreBuildEventターゲットの実行を無効にしました。 – VeeTheSecond

関連する問題