タスクの作成

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

タスクでは、ビルド プロセスの間に実行するコードを指定します。 タスクはターゲット内に含まれます。 MSBuild には一般的なタスクのライブラリが含まれていますが、独自にタスクを作成することもできます。 MSBuild に付属のタスク ライブラリの詳細については、「Task Reference」を参照してください。

タスク

タスクの例として、1 つ以上のファイルをコピーする Copy、ディレクトリを作成する MakeDir、Visual C# ソース コード ファイルをコンパイルする Csc などがあります。 各タスクは、ITask インターフェイスを実装する .NET クラスとして実装されます。これは、Microsoft.Build.Framework.dll アセンブリで定義されます。

タスクを実装する際には、次の 2 つの手法があります。

  • ITask インターフェイスを直接実装する。

  • ヘルパー クラス Task からクラスを派生させる。これは、Microsoft.Build.Utilities.dll アセンブリで定義されます。 タスクは 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;  
         }  

        private string myProperty;  
        public string MyProperty  
        {  
            get { return myProperty; }  
            set { myProperty = value; }  
        }  
    }  
}  

次のプロジェクト ファイルはこのタスクを実行し、MyProperty に特定の値を設定します。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
   <Target Name="MyTarget">  
      <SimpleTask MyProperty="Value for MyProperty" />  
   </Target>  
</Project>  

タスクの登録

プロジェクトがタスクを実行する場合は、タスク クラスを含むアセンブリの検索方法を MSBuild が認識している必要があります。 タスクは UsingTask Element (MSBuild) を使用して登録されます。

MSBuild の Microsoft.Common.Tasks ファイルは、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  
{  
    private IBuildEngine buildEngine;  
    public IBuildEngine BuildEngine  
    {  
        get{ return buildEngine; }  
        set{ buildEngine = value; }  
    }  

    public override bool Execute()  
    {  
        TaskEventArgs taskEvent =  
            new TaskEventArgs(BuildEventCategory.Custom,  
            BuildEventImportance.High, "Important Message",  
           "SimpleTask");  
        BuildEngine.LogBuildEvent(taskEvent);  
        return true;  
    }  
}  

設定する必須のタスク パラメーター

特定のタスク プロパティを "required" とマークすると、タスクを実行するすべてのプロジェクト ファイルでそのプロパティの値を設定する必要があり、設定しない場合はビルドが失敗します。 次のように [Required] 属性をタスクの .NET プロパティに適用します。

private string requiredProperty;  

[Required]  
public string RequiredProperty  
{  
    get { return requiredProperty; }  
    set { requiredProperty = value; }  
}  

[Required] 属性は、Microsoft.Build.Framework 名前空間の RequiredAttribute によって定義されます。

Description

次の Visual 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;  
        }  
    }  
}  

Description

次の Visual 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.  
        private IBuildEngine buildEngine;  
        public IBuildEngine BuildEngine  
        {  
            get  
            {  
                return buildEngine;  
            }  
            set  
            {  
                buildEngine = value;  
            }  
         }  

        // 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.  
        private Object hostObject;  
        public Object HostObject  
        {  
            get  
            {  
                return hostObject;  
            }  

            set  
            {  
                hostObject = value;  
            }  
        }  

        public bool Execute()  
        {  
            // This is where the task would presumably do its work.  
            return true;  
        }  
    }  
}  

Description

この Visual 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;
		}
	}
}

Description

次の例は、前に示したタスクの例 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>  

参照

Task Reference
Task Reference