Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Aufgaben sind in MSBuild-Zielen enthalten und stellen den Code bereit, der während des Buildprozesses ausgeführt wird. MSBuild enthält eine Bibliothek mit typischen Aufgaben, und Sie können auch Eigene Aufgaben erstellen. Weitere Informationen zur Aufgabenbibliothek, die MSBuild enthält, finden Sie unter MSBuild-Aufgabenreferenz.
Voraussetzungen
Ein Visual Studio-Projekt, das mit MSBuild erstellt wird.
Aufgaben
Beispiele für MSBuild-Aufgaben sind Copy, die eine oder mehrere Dateien kopiert, MakeDir, die ein Verzeichnis erstellt, und Csc, die C#-Quellcodedateien kompiliert. Jede Aufgabe wird als .NET-Klasse implementiert, die die ITask in der Microsoft.Build.Framework.dll-Assembly definierte Schnittstelle implementiert.
Sie können eine der folgenden Ansätze verwenden, wenn Sie eine Aufgabe implementieren:
Implementieren Sie die ITask Schnittstelle direkt.
Leiten Sie Ihre Klasse von der Hilfsklasse Task ab, die in der Assembly Microsoft.Build.Utilities.dll definiert ist.
TaskimplementiertITaskund bietet Standardimplementierungen einigerITaskMitglieder. Die Protokollierung ist auch einfacher.
In beiden Fällen müssen Sie ihrer Klasse eine Methode mit dem Namen Executehinzufügen, die aufgerufen wird, wenn die Aufgabe ausgeführt wird. Diese Methode akzeptiert keine Parameter und gibt einen Boolean Wert zurück: true, wenn die Aufgabe erfolgreich war oder false, wenn sie fehlgeschlagen ist. Das folgende Beispiel zeigt eine Aufgabe, die keine Aktion ausführt, erfolgreich abgeschlossen wird und true zurückgibt.
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace MyTasks
{
public class SimpleTask : Task
{
public override bool Execute()
{
return true;
}
}
}
Die folgende MSBuild-Projektdatei führt den vorherigen Vorgang aus:
<Project>
<Target Name="MyTarget">
<SimpleTask />
</Target>
</Project>
Wenn Vorgänge ausgeführt werden, können sie auch Eingaben aus der Projektdatei empfangen, wenn Sie .NET-Eigenschaften für die Aufgabenklasse erstellen. MSBuild legt diese Eigenschaften unmittelbar vor dem Aufrufen der Execute-Methode der Aufgabe fest. Verwenden Sie zum Erstellen einer Zeichenfolgeneigenschaft Aufgabencode wie das folgende Beispiel:
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; }
}
}
In der folgenden Projektdatei wird dieser Vorgang ausgeführt und auf den angegebenen Wert festgelegt MyProperty .
<Project>
<Target Name="MyTarget">
<SimpleTask MyProperty="Value for MyProperty" />
</Target>
</Project>
So ruft MSBuild Aufgaben auf
Wenn MSBuild einen Vorgang aufruft, instanziiert es zuerst die Aufgabenklasse und ruft dann die Eigenschaftensetter dieses Objekts für Vorgangsparameter auf, die im Aufgabenelement in der Projektdatei festgelegt sind. Wenn das Aufgabenelement keinen Parameter angibt oder der im Element angegebene Ausdruck als leere Zeichenfolge ausgewertet wird, wird der Eigenschaftensatzer nicht aufgerufen.
Im folgenden Projekt wird beispielsweise nur der Setter Input3 aufgerufen.
<Project>
<Target Name="InvokeCustomTask">
<CustomTask Input1=""
Input2="$(PropertyThatIsNotDefined)"
Input3="value3" />
</Target>
</Project>
Ein Vorgang sollte nicht von einer relativen Reihenfolge des Aufrufs des Parameter-Eigenschaftssatzers abhängen.
Aufgabenparametertypen
MSBuild behandelt systemeigene Eigenschaften vom Typ string, boolund ITaskItemITaskItem[]. Wenn eine Aufgabe einen Parameter eines anderen Typs ChangeType akzeptiert, ruft MSBuild zum Konvertieren von string, wobei alle Eigenschafts- und Elementverweise erweitert wurden, in den Zieltyp auf. Wenn die Konvertierung für einen Eingabeparameter fehlschlägt, gibt MSBuild einen Fehler aus und ruft die Methode der Execute() Aufgabe nicht auf.
Registrieren von Aufgaben
Um eine Aufgabe auszuführen, muss MSBuild wissen, wie die Assembly gefunden und ausgeführt wird, die die Taskklasse enthält. Aufgaben werden mithilfe des UsingTask-Elements (MSBuild)registriert.
Wenn Ihre Aufgabe laufzeitspezifische Abhängigkeiten aufweist, müssen Sie MSBuild leiten, um die Aufgabe in einer bestimmten Umgebung auszuführen, indem Sie die ArchitectureRuntime Attribute in ihrem UsingTask Element angeben. Weitere Informationen finden Sie unter UsingTask-Attribute und Vorgangsparameter.
Die MSBuild-Datei "Microsoft.Common.tasks " ist eine Projektdatei, die die UsingTask Elemente auflistet, die alle mit MSBuild bereitgestellten Aufgaben registrieren. Diese Datei wird automatisch eingeschlossen, wenn MSBuild ein beliebiges Projekt erstellt. Wenn ein in Microsoft.Common.tasks registrierter Vorgang auch in der aktuellen Projektdatei registriert ist, hat die aktuelle Projektdatei Vorrang, sodass Sie einen Standardvorgang mit Ihrem eigenen Vorgang mit demselben Namen überschreiben können.
Tipp
Sie können eine Liste der Aufgaben anzeigen, die mit einer bestimmten Version von MSBuild bereitgestellt werden, indem Sie den Inhalt der Datei "Microsoft.Common.tasks " anzeigen.
Aufgabeneigenschaften müssen festgelegt werden
Sie können bestimmte Vorgangseigenschaften nach Bedarf markieren, sodass jede Projektdatei, die den Vorgang ausführt, Werte für diese Eigenschaften festlegen muss oder der Build fehlschlägt. Wenden Sie das attribut [Required] auf die .NET-Eigenschaft in Ihrer Aufgabe wie folgt an:
[Required]
public string RequiredProperty { get; set; }
Das [Required]-Attribut wird durch RequiredAttribute im Microsoft.Build.Framework-Namespace definiert.
Auslösen von Ereignissen aus einer Aufgabe
Wenn Ihre Aufgabe von der Task Hilfsklasse abgeleitet ist, können Sie eine der folgenden Hilfsmethoden für die Task Klasse verwenden, um Ereignisse auszuheben, die von allen registrierten Loggern erfasst und angezeigt werden:
public override bool Execute()
{
Log.LogError("messageResource1", "1", "2", "3");
Log.LogWarning("messageResource2");
Log.LogMessage(MessageImportance.High, "messageResource3");
...
}
Wenn Ihre Aufgabe direkt ITask implementiert, können Sie solche Ereignisse weiterhin auslösen, aber Sie müssen die IBuildEngine Schnittstelle verwenden. Das folgende Beispiel zeigt eine Aufgabe, die ein benutzerdefiniertes ITask Ereignis implementiert und auslöst.
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;
}
}
Verpacken der Aufgabe
Die empfohlene Methode zum Verteilen einer Aufgabe befindet sich in einem NuGet-Paket. Das Paket muss alle Abhängigkeiten bündeln. Ein Lernprogramm, das Sie durch das Erstellen einer benutzerdefinierten Aufgabe führt, finden Sie unter Erstellen eines NuGet-Pakets.
Beispiel 1
Die folgende C#-Klasse veranschaulicht eine Aufgabe, die von der Task Hilfsklasse abgeleitet wird. Dieser Vorgang gibt truezurück, was anzeigt, dass er erfolgreich war.
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;
}
}
}
Beispiel 2
Die folgende C#-Klasse veranschaulicht eine Aufgabe, die die ITask Schnittstelle implementiert. Dieser Vorgang gibt truezurück, was anzeigt, dass er erfolgreich war.
using System;
using Microsoft.Build.Framework;
namespace SimpleTask2
{
public class SimpleTask2: ITask
{
//When implementing the ITask interface, it's 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's 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 does its work.
return true;
}
}
}
Beispiel 3
Diese C#-Klasse veranschaulicht eine Aufgabe, die von der Task Hilfsklasse abgeleitet wird. Die Aufgabe verfügt über eine erforderliche Zeichenfolgeneigenschaft und löst ein Ereignis aus, das von allen registrierten Loggern angezeigt wird.
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;
}
}
}
Beispiel 4
Das folgende Beispiel zeigt eine Projektdatei, die den vorherigen Beispielvorgang aufruft. SimpleTask3
<Project>
<UsingTask TaskName="SimpleTask3.SimpleTask3"
AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>
<Target Name="MyTarget">
<SimpleTask3 MyProperty="Hello!"/>
</Target>
</Project>