Aracılığıyla paylaş


Görev yazma

Görevler, derleme işlemi sırasında çalışacak 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örev

Görevlere örnek olarak bir veya daha fazla dosya 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 ITask arabirimini uygulayan bir .NET sınıfı olarak uygulanır.

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

  • ITask arabirimini doğrudan uygulayın.

  • sınıfınızı Microsoft.Build.Utilities.dll derlemesinde tanımlanan Taskyardımcı sınıfından tü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 Executeadlı bir yöntem eklemeniz gerekir. Bu yöntem parametre almaz ve Boolean bir değer döndürür: görevin başarılı olup olmadığını true veya başarısız olursa false. Aşağıdaki örnekte, hiçbir eylem gerçekleştirmeden başarıyla tamamlanan (truedöndürür) bir görev gösterilmektedir.

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 MyProperty verilen değere ayarlar:

<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, MSBuild'e, UsingTask içindeki Architecture ve/veya Runtime belirtengörevi belirli bir ortamda çalıştırması gerektiğini bildirmelisiniz.

Microsoft.Common.tasks MSBuild dosyası, MSBuild ile sağlanan tümgörevlerini kaydeden UsingTask öğelerinin listesini içeren bir proje dosyasıdır. Bu dosya, herhangi bir proje oluşturulurken otomatik olarak eklenir. Microsoft.Common.tasks kayıtlı bir görev geçerli proje dosyasına da kaydedilirse, 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.tasksiçeriğini görüntüleyerek MSBuild'in belirli bir sürümüyle sağlanan görevlerin listesini görebilirsiniz.

Görevden kaynaklanan olayları tetikleme

Göreviniz Task yardımcı sınıfından türetilirse, Task sınıfında aşağıdaki yardımcı yöntemlerden herhangi birini kullanarak kayıtlı günlükçüler tarafından yakalanacak ve görüntülenecek olayları oluşturabilirsiniz:

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

Göreviniz doğrudan ITask uyguluyorsa, 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

Bazı görev özelliklerini "gerekli" olarak işaretleyebilirsiniz, böylece görevi çalıştıran herhangi bir proje dosyası bu özellikler için değerler ayarlamalı, aksi takdirde derleme başarısız olur. [Required] özniteliğini görevinizdeki .NET özelliğine aşağıdaki gibi uygulayın:

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

[Required] özniteliği, Microsoft.Build.Framework ad alanında RequiredAttribute tarafından 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 Input3 ayarlayıcısı ç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, string, bool, ITaskItem ve ITaskItem[]türündeki özellikleri yerel olarak işler. Bir görev farklı türde bir parametre kabul ederse, MSBuild string (tüm özellik ve öğe başvuruları genişletilmiş olarak) hedef türe dönüştürmek için ChangeType çağırır. 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.

Görevi paketleme

Bir görevi dağıtmanın önerilen yolu NuGet paketindedir. Paketin tüm bağımlılıkları paketlemesi gerekir. Bu konu, özel görev oluşturma işleminde size yol gösteren bir öğreticide ayrıntılı olarak açıklanmıştır. bkz. NuGet paketi oluşturma.

Örnek 1

Açıklama

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

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ı, ITask arabirimini uygulayan bir görevi gösterir. Bu görev, başarılı olduğunu belirten true'ı döndürür.

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ı, Task yardımcı sınıfından türetilen bir görevi gösterir. Gereken bir dize özelliğine sahiptir ve tüm kayıtlı günlükçüler tarafından kaydedilen bir olayı tetikler.

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>