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 等があるので、自前で何か作る必要性は少ないでしょうが、知ってると良い事があるかもしれませんね。