MSBuild のカスタムタスクを実装する

ITask インターフェイス (Microsoft.Build.Framework) を実装すれば OK です。
既定の実装として、Task クラス (Microsoft.Build.Utilities) が用意されています。
というわけで、早速試してみましょう。

HelloWorld.cs

using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

namespace HelloWorldTasks
{
  public class HelloWorld : Task
  {
    [Required]
    public string Message { get; set; }

    public override bool Execute()
    {
      // Required で Null or Empty は除外出来るが、WhiteSpace のみは失敗にしてみた
      if (string.IsNullOrWhiteSpace(Message))
      {
        return false;
      }

      Console.WriteLine("Hello World " + Message);
      return true;
    }
  }
}

Task クラスを継承して Execute メソッドを override します。Execute メソッドの戻り値は、タスクの成功/失敗を表します。
プロパティを定義すると、MSBuild プロジェクトファイルからパラメータを渡す事が出来ます。
今回は Messeage という必須のプロパティを定義しました。RequiredAttribute クラス (Microsoft.Build.Framework) をプロパティに設定すると、MSBuild プロジェクトファイル で未設定の場合、エラーになります。
※今回は使用しませんが、プロパティはタスクの戻り値としても利用出来ます。


では、これを利用してみましょう。クラスライブラリとしてコンパイルし、作成された HelloWorldTasks.dll を用意します。

HelloWorld.proj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\HelloWorldTasks.dll" TaskName="HelloWorld"/>
  <Target Name="Default">
    <HelloWorld Message="MSBuild Custom Task"/>
  </Target>
</Project>

HelloWorld.proj と HelloWorldTasks.dll を同じフォルダーに配置し、MSBuild で実行してみます。

"Hello World MSBuild Custom Task" と出力されましたね。
ちなみに、Message を指定しなかった場合はエラーになります。

Message にスペースを指定して、タスクを失敗させた場合はこんな感じです。


前回紹介した、MSBuild Comunity Tasks や、MSBuild Extension Pack 等があるので、自前で何か作る必要性は少ないでしょうが、知ってると良い事があるかもしれませんね。