MSBuild 4.0 からインラインタスクが書けます

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 で指定出来る場所ならどこでも可