2010-11-26 13 views
4

私はビルド後のステップとは別に必要なすべてのことをやっているMSBuildスクリプトを持っています(私が以前質問した質問:MSBuild conditional Exec?を参照)。MSBuildポストビルド

私が探しているのは、多くのcsprojファイルをビルドし、プロジェクトがビルドされている場合にのみビルド後の手順を実行することです。ポストビルドのステップを常時実行したくない場合は、最終出力のタイムスタンプが不必要に変更されます(ビルドプロセスが非常に時間がかかります)。私のMSBuildスクリプトで

は、私は私のcsprojファイルのそれぞれについて、以下のようなものを持っている:

<Target Name="ProjectName"> 
    <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" /> 
</Target> 

編集: 私は本当にときCoreCompileタスクの実行を検出している何をしたいかと思いますプロジェクトごとにある状態でこれを確認する方法があれば?

アイデア?

私はMSBuildを初めて使っているので、間違っている可能性があります。

おかげで、 アラン

答えて

1

ずっと私は1つを見つけて動作しますが、最善の解決策ではないかもしれない私自身の解決策を考え出す終わっていなかったこの問題の簡単な解決策を検索した後。しかし、私は同じ問題を抱えている他の人と共有したいので、少なくとも実用的な解決策があり、うまくいけば頭がいっぱいになることはありません。

要約すると、プロジェクトの作成後、アセンブリが更新された(タイムスタンプが変更された)場合のみ、コマンドラインツールを実行したかったのです。ポストビルドを私たちのビルドサーバー(開発マシンではない)上で実行したかっただけなので、私はこれをすべてのプロジェクトのポストビルドセクションに入れたくありませんでした。

メインの.projファイルでこれを外部的に行う方法が見つからず、各.csprojファイルのポストビルドセクションが変更されてしまいました。このコマンドは、開発マシン上で実行されることはありませんが、私は私の.projファイルからビルドを起動したときに私はそのフラグを設定することができることを意味し

if '$(ExecuteCommand)' == 'true' command.exe 

:しかし、私はこのような場合、条件何かでそれを接頭辞このような真:

<!-- Define common properties --> 
<PropertyGroup> 
    <ExecuteCommand>true</ExecuteCommand> 
</PropertyGroup> 

<Target Name="YourTarget"> 
    <!-- Build project --> 
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" /> 
</Target> 

私が言ったように、私はそれが最も優雅な解決策ですが、それは確かに動作し、当面は私のために十分であろうとは思いません。しかし、私はまだこれを達成する正しい方法が私のスクリプトを改善することができるか聞くことに興味があるでしょう。

おかげで、あなたもあなたのビルドプロセスで選択された構成に基づいて、それを行うことができます アラン

2

。あなたのプロジェクトのそれぞれに以下を追加することができた場合はCIのために、あなたは常に「リリース」又は「製造」(あなたがあなた自身を定義することができます)

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/> 
0

を使用する必要があります。

<Target Name="DoStuffWithNewlyCompiledAssembly"> 
    <Exec Command="command.exe" /> 
</Target> 

...その後、あなただけのプロパティを追加する必要があります。マイクロソフトのスマート誰かが(ファイル名は、言語とMSBuildの/ Visual Studioのバージョンに依存しMicrosoft.[CSharp|VisualBasic][.Core].targetsCoreCompileターゲットの最後に次の行を追加したので

<Target Name="Name"> 
    <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" /> 
</Target> 

これは動作します)。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

ですから、TargetsTriggeredByCompilationプロパティでターゲット名を指定した場合、あなたの目標はCoreCompile runs--場合に実行されますとCoreCompileはスキップされている場合、あなたのターゲットが実行されません(例えば、出力アセンブリは、すでに対であるため、コードに関する日付)。