MSDN MSBuild インラインタスク
MSDN チュートリアル: インライン タスクの作成
MSBuild ファイル(.*proj) や ターゲットファイル(.targets) ファイル内に C# でタスクを実装出来るよという感じです。
Test.proj
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' DefaultTargets="Test" ToolsVersion="4.0"> <UsingTask TaskName="GTE" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <ParameterGroup> <A ParameterType="System.Int32" Required="true" /> <B ParameterType="System.Int32" Required="true" /> <Ret ParameterType="System.Boolean" Output="true" /> </ParameterGroup> <Task> <Code Type="Fragment" Language="cs"> <![CDATA[ Ret = A >= B; ]]> </Code> </Task> </UsingTask> <Target Name="Test"> <GTE A="4" B="5"> <Output PropertyName="Result" TaskParameter="Ret" /> </GTE> <Message Text="$(Result)" Importance="High" /> <GTE A="100" B="90"> <Output PropertyName="Result" TaskParameter="Ret" /> </GTE> <Message Text="$(Result)" Importance="High" /> </Target> </Project>
実行するとこんな感じ。
このインラインタスクは、TaskFactory に渡すクラスを変更することで PowerShell 等で実装する事も出来ます。
MSBuild Windows PowerShell Task Factory - Home
こちらをダウンロードし、ビルド後出来たアセンブリを .proj と同階層に配置します。*1
TestPS.proj
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' DefaultTargets="Test" ToolsVersion="4.0"> <UsingTask TaskName="GTE" TaskFactory="WindowsPowershellTaskFactory" AssemblyFile=".\WindowsPowershellTaskFactory.dll" > <ParameterGroup> <A ParameterType="System.Int32" Required="true" /> <B ParameterType="System.Int32" Required="true" /> <Ret ParameterType="System.Boolean" Output="true" /> </ParameterGroup> <Task> <![CDATA[ $Ret = $A -ge $B ]]> </Task> </UsingTask> <Target Name="Test"> <GTE A="4" B="5"> <Output PropertyName="Result" TaskParameter="Ret" /> </GTE> <Message Text="$(Result)" Importance="High" /> <GTE A="100" B="90"> <Output PropertyName="Result" TaskParameter="Ret" /> </GTE> <Message Text="$(Result)" Importance="High" /> </Target> </Project>
PowerShellTaskFactory だと、<Task> タグの下に CDATA を使って実装します。※<Code> タグ入れるとエラーになりました。
これを実行するとこんな感じ。
カスタムタスクを実装しアセンブリにしてしまうと、配布の面倒さが出てしまい MSBuild ファイル(.*proj) だけでなく、カスタムタスクアセンブリもインストール/配布する必要が出てしまいますがこれなら安心ですね。
色々面白そうなことを紹介しているサイトもありました。
MsBuild 4.0の新機能でビルド時コード生成とか | kazuk は null に触れてしまった
Visual Studio プロジェクトテンプレートの作り方 | kazuk は null に触れてしまった
*1:.proj で指定出来る場所ならどこでも可