タスク作成
タスクは、ビルド プロセス中に実行されるコードを提供します。 タスクはターゲットに含まれます。 一般的なタスクのライブラリは MSBuild に含まれており、独自のタスクを作成することもできます。 MSBuild に含まれるタスクのライブラリの詳細については、「タスク リファレンス」を参照してください。
用事
タスクの例としては、1 つ以上のファイルをコピーする のコピー、ディレクトリを作成する MakeDir 、C# ソース コード ファイルをコンパイルする Csc などがあります。 各タスクは、Microsoft.Build.Framework.dll アセンブリで定義されている ITask インターフェイスを実装する .NET クラスとして実装されます。
タスクを実装するときに使用できる方法は 2 つあります。
ITask インターフェイスを直接実装します。
Microsoft.Build.Utilities.dll アセンブリで定義されているヘルパー クラス Taskからクラスを派生させます。 Task は ITask を実装し、一部の ITask メンバーの既定の実装を提供します。 さらに、ログ記録が簡単になります。
どちらの場合も、タスクの実行時に呼び出されるメソッドである Execute
という名前のメソッドをクラスに追加する必要があります。 このメソッドはパラメーターを取らず、Boolean
値を返します。タスクが成功した場合は true
、失敗した場合は false
。 次の例は、アクションを実行せず、正常に完了する (true
を返す) タスクを示しています。
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace MyTasks
{
public class SimpleTask : Task
{
public override bool Execute()
{
return true;
}
}
}
次のプロジェクト ファイルは、このタスクを実行します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask />
</Target>
</Project>
タスクを実行するときに、タスク クラスに .NET プロパティを作成すると、プロジェクト ファイルから入力を受け取ることもできます。 MSBuild は、タスクの Execute
メソッドを呼び出す直前に、これらのプロパティを設定します。 文字列プロパティを作成するには、次のようなタスク コードを使用します。
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace MyTasks
{
public class SimpleTask : Task
{
public override bool Execute()
{
return true;
}
public string MyProperty { get; set; }
}
}
次のプロジェクト ファイルは、このタスクを実行し、MyProperty
を指定された値に設定します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask MyProperty="Value for MyProperty" />
</Target>
</Project>
タスクの登録
プロジェクトでタスクを実行する場合、MSBuild はタスク クラスを含むアセンブリを検索して実行する方法を認識している必要があります。 タスクは、UsingTask 要素 (MSBuild)を使用して登録されます。
タスクにランタイム固有の依存関係がある場合は、UsingTask で Architecture
または Runtime
を示して、特定の環境でタスクを実行する必要があることを MSBuild に通知する必要があります。
Microsoft.Common.tasks MSBuild ファイルは、MSBuild で提供されるすべてのタスクを登録する UsingTask
要素の一覧を含むプロジェクト ファイルです。 このファイルは、プロジェクトのビルド時に自動的に含まれます。 Microsoft.Common.tasks に登録されているタスクが現在のプロジェクト ファイルにも登録されている場合は、現在のプロジェクト ファイルが優先されるため、既定のタスクを同じ名前の独自のタスクでオーバーライドできます。
ヒント
特定のバージョンの MSBuild で提供されているタスクの一覧を表示するには、Microsoft.Common.tasksの内容を表示します。
タスクからイベントを発生させる
タスクが Task ヘルパー クラスから派生している場合は、Task クラスで次のいずれかのヘルパー メソッドを使用して、登録されているロガーによってキャッチおよび表示されるイベントを発生させることができます。
public override bool Execute()
{
Log.LogError("messageResource1", "1", "2", "3");
Log.LogWarning("messageResource2");
Log.LogMessage(MessageImportance.High, "messageResource3");
...
}
タスクが ITask を直接実装している場合でも、そのようなイベントを発生させることができますが、IBuildEngine インターフェイスを使用する必要があります。 次の例は、ITask を実装し、カスタム イベントを発生させるタスクを示しています。
public class SimpleTask : ITask
{
public IBuildEngine BuildEngine { get; set; }
public override bool Execute()
{
TaskEventArgs taskEvent =
new TaskEventArgs(BuildEventCategory.Custom,
BuildEventImportance.High, "Important Message",
"SimpleTask");
BuildEngine.LogBuildEvent(taskEvent);
return true;
}
}
タスク パラメーターを設定する必要がある
タスクを実行するプロジェクト ファイルでこれらのプロパティの値を設定する必要がある場合、またはビルドが失敗するように、特定のタスク プロパティを "必須" としてマークできます。 タスクの .NET プロパティに [Required]
属性を次のように適用します。
[Required]
public string RequiredProperty { get; set; }
[Required]
属性は、Microsoft.Build.Framework 名前空間の RequiredAttribute によって定義されます。
MSBuild がタスクを呼び出す方法
タスクを呼び出すとき、MSBuild は最初にタスク クラスをインスタンス化してから、そのオブジェクトのプロパティ セッターを呼び出して、プロジェクト ファイル内のタスク要素に設定されているタスク パラメーターを指定します。 タスク要素がパラメーターを指定しない場合、または要素で指定された式が空の文字列に評価される場合、プロパティ セッターは呼び出されません。
たとえば、プロジェクト内で
<Project>
<Target Name="InvokeCustomTask">
<CustomTask Input1=""
Input2="$(PropertyThatIsNotDefined)"
Input3="value3" />
</Target>
</Project>
Input3
のセッターのみが呼び出されます。
タスクは、パラメーター プロパティ セッター呼び出しの相対順序に依存しないでください。
タスク パラメーターの種類
MSBuild は、string
、bool
、ITaskItem
、ITaskItem[]
の型のプロパティをネイティブに処理します。 タスクが別の型のパラメーターを受け取る場合、MSBuild は ChangeType を呼び出して string
(すべてのプロパティと項目参照が展開された状態) から変換先の型に変換します。 入力パラメーターの変換が失敗した場合、MSBuild はエラーを出力し、タスクの Execute()
メソッドを呼び出しません。
タスクのパッケージ化
タスクを配布する推奨される方法は、NuGet パッケージ内にあります。 パッケージは、すべての依存関係をバンドルする必要があります。 このトピックは、カスタム タスクを作成するチュートリアルで詳しい説明を行います。 「NuGet パッケージを作成する」を参照してください。
例 1
説明
次の C# クラスは、Task ヘルパー クラスから派生するタスクを示しています。 このタスクは、成功したことを示す true
を返します。
コード
using System;
using Microsoft.Build.Utilities;
namespace SimpleTask1
{
public class SimpleTask1: Task
{
public override bool Execute()
{
// This is where the task would presumably do its work.
return true;
}
}
}
例 2
説明
次の C# クラスは、ITask インターフェイスを実装するタスクを示しています。 このタスクは、成功したことを示す true
を返します。
コード
using System;
using Microsoft.Build.Framework;
namespace SimpleTask2
{
public class SimpleTask2: ITask
{
//When implementing the ITask interface, it is necessary to
//implement a BuildEngine property of type
//Microsoft.Build.Framework.IBuildEngine. This is done for
//you if you derive from the Task class.
public IBuildEngine BuildEngine { get; set; }
// When implementing the ITask interface, it is necessary to
// implement a HostObject property of type object.
// This is done for you if you derive from the Task class.
public object HostObject { get; set; }
public bool Execute()
{
// This is where the task would presumably do its work.
return true;
}
}
}
例 3
説明
この C# クラスは、Task ヘルパー クラスから派生するタスクを示しています。 必須の文字列プロパティがあり、登録されているすべてのロガーによって表示されるイベントを発生させます。
コード
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace SimpleTask3
{
public class SimpleTask3 : Task
{
private string myProperty;
// The [Required] attribute indicates a required property.
// If a project file invokes this task without passing a value
// to this property, the build will fail immediately.
[Required]
public string MyProperty
{
get
{
return myProperty;
}
set
{
myProperty = value;
}
}
public override bool Execute()
{
// Log a high-importance comment
Log.LogMessage(MessageImportance.High,
"The task was passed \"" + myProperty + "\".");
return true;
}
}
}
例 4
説明
次の例は、前のタスク例 SimpleTask3 を呼び出すプロジェクト ファイルを示しています。
コード
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="SimpleTask3.SimpleTask3"
AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>
<Target Name="MyTarget">
<SimpleTask3 MyProperty="Hello!"/>
</Target>
</Project>
関連コンテンツ
- カスタム タスク を作成する
- MSBuild を使用して REST API クライアントを作成する
- タスク リファレンス