Görev yazma

Görevler, derleme işlemi sırasında çalışan kodu sağlar. Görevler hedeflerde yer alır. MSBuild'e tipik görev kitaplığı eklenmiştir ve kendi görevlerinizi de oluşturabilirsiniz. MSBuild'e dahil edilen görev kitaplığı hakkında daha fazla bilgi için bkz . Görev başvurusu.

Görevler

Görevlere örnek olarak bir veya daha fazla dosyayı kopyalayan Kopyala, dizin oluşturan MakeDir ve C# kaynak kodu dosyalarını derleyen Csc verilebilir. Her görev, Microsoft.Build.Framework.dll derlemesinde tanımlanan arabirimi uygulayan ITask bir .NET sınıfı olarak uygulanır.

Görev uygularken kullanabileceğiniz iki yaklaşım vardır:

  • ITask Arabirimi doğrudan uygulayın.

  • Sınıfınızı Microsoft.Build.Utilities.dll derlemesinde tanımlanan yardımcı sınıfından Tasktüretin. Görev ITask uygular ve bazı ITask üyelerinin varsayılan uygulamalarını sağlar. Ayrıca günlük kaydı daha kolaydır.

Her iki durumda da sınıfınıza, görev çalıştırıldığında çağrılan yöntem olan adlı Executebir yöntem eklemeniz gerekir. Bu yöntem parametre almaz ve bir Boolean değer döndürür: true görev başarılıysa veya false başarısız olduysa. Aşağıdaki örnekte, hiçbir eylem gerçekleştirmeden başarıyla tamamlayan (döndürür) bir görev gösterilmektedir true.

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

namespace MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            return true;
        }
    }
}

Aşağıdaki proje dosyası bu görevi çalıştırır:

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

Görevler çalıştırıldığında, görev sınıfında .NET özellikleri oluşturursanız proje dosyasından da giriş alabilirler. MSBuild, görevin Execute yöntemini çağırmadan hemen önce bu özellikleri ayarlar. Dize özelliği oluşturmak için aşağıdaki gibi görev kodunu kullanın:

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; }
    }
}

Aşağıdaki proje dosyası bu görevi çalıştırır ve verilen değere ayarlar MyProperty :

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

Görevleri kaydetme

Bir proje bir görevi çalıştıracaksa, MSBuild görev sınıfını içeren derlemenin nasıl bulunacağını ve çalıştırıldığını bilmelidir. Görevler UsingTask öğesi (MSBuild) kullanılarak kaydedilir.

Görevinizin çalışma zamanına özgü bağımlılıkları varsa, ve/veya Runtime usingTask değerini belirterek MSBuild'e görevi belirli bir ortamda çalıştırması Architecture gerektiğini bildirmeniz gerekir.

MSBuild dosyası Microsoft.Common.tasks, MSBuild ile sağlanan tüm görevleri kaydeden öğelerin listesini UsingTask içeren bir proje dosyasıdır. Bu dosya, herhangi bir proje oluşturulurken otomatik olarak eklenir. Microsoft.Common.tasks dosyasına kaydedilmiş bir görev de geçerli proje dosyasına kayıtlıysa, geçerli proje dosyası önceliklidir, böylece varsayılan görevi aynı ada sahip kendi görevinizle geçersiz kılabilirsiniz.

Bahşiş

Microsoft.Common.tasks içindekileri görüntüleyerek MSBuild'in belirli bir sürümüyle sağlanan görevlerin listesini görebilirsiniz.

Görevden olay oluşturma

Göreviniz yardımcı sınıfından Task türetilirse, herhangi bir kayıtlı günlüğe kaydeden tarafından yakalanacak ve görüntülenecek olayları yükseltmek için sınıfındaki Task aşağıdaki yardımcı yöntemlerden herhangi birini kullanabilirsiniz:

public override bool Execute()
{
    Log.LogError("messageResource1", "1", "2", "3");
    Log.LogWarning("messageResource2");
    Log.LogMessage(MessageImportance.High, "messageResource3");
    ...
}

Göreviniz doğrudan uygulanıyorsa ITask , yine de bu tür olaylar oluşturabilirsiniz, ancak IBuildEngine arabirimini kullanmanız gerekir. Aşağıdaki örnekte ITask uygulayan ve özel olay oluşturan bir görev gösterilmektedir:

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;
    }
}

Görev parametrelerinin ayarlanmasını gerektir

Görevi çalıştıran tüm proje dosyalarının bu özellikler için değer ayarlaması veya derlemenin başarısız olması için belirli görev özelliklerini "gerekli" olarak işaretleyebilirsiniz. özniteliğini [Required] görevinizdeki .NET özelliğine aşağıdaki gibi uygulayın:

[Required]
public string RequiredProperty { get; set; }

[Required] özniteliği, ad alanında Microsoft.Build.Framework tarafından RequiredAttribute tanımlanır.

MSBuild bir görevi nasıl çağırır?

Bir görevi çağırırken, MSBuild önce görev sınıfını başlatır, sonra bu nesnenin özellik ayarlayıcılarını proje dosyasındaki görev öğesinde ayarlanan görev parametreleri için çağırır. Görev öğesi bir parametre belirtmezse veya öğesinde belirtilen ifade boş bir dize olarak değerlendirilirse, özellik ayarlayıcısı çağrılmaz.

Örneğin, projede

<Project>
 <Target Name="InvokeCustomTask">
  <CustomTask Input1=""
              Input2="$(PropertyThatIsNotDefined)"
              Input3="value3" />
 </Target>
</Project>

yalnızca için Input3 ayarlayıcı çağrılır.

Bir görev, parametre-özellik ayarlayıcısı çağırmasının göreli sırasına bağlı olmamalıdır.

Görev parametresi türleri

MSBuild, , boolITaskItem ve ITaskItem[]türündeki stringözellikleri yerel olarak işler. Bir görev farklı türde bir parametre kabul ederse, MSBuild hedef türe dönüştürmek string için çağırır ChangeType (tüm özellik ve öğe başvuruları genişletilmiş olarak). Dönüştürme herhangi bir giriş parametresi için başarısız olursa, MSBuild bir hata yayar ve görevin Execute() yöntemini çağırmaz.

Örnek 1

Açıklama

Aşağıdaki C# sınıfı, yardımcı sınıfından Task türetilen bir görevi gösterir. Bu görev, başarılı olduğunu belirten değerini döndürür true.

Kod

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;
        }
    }
}

Örnek 2

Açıklama

Aşağıdaki C# sınıfı arabirimini uygulayan ITask bir görevi gösterir. Bu görev, başarılı olduğunu belirten değerini döndürür true.

Kod

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;
        }
    }
}

Örnek 3

Açıklama

Bu C# sınıfı, yardımcı sınıfından türetilen Task bir görevi gösterir. Gerekli bir dize özelliğine sahiptir ve tüm kayıtlı günlükçüler tarafından görüntülenen bir olay oluşturur.

Kod

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;
        }
    }
}

Örnek 4

Açıklama

Aşağıdaki örnekte, önceki örnek görev olan SimpleTask3'i çağıran bir proje dosyası gösterilmektedir.

Kod

<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>