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.
Task
implementiertITask
und bietet Standardimplementierungen einigerITask
Mitglieder. Die Protokollierung ist auch einfacher.
In beiden Fällen müssen Sie ihrer Klasse eine Methode mit dem Namen Execute
hinzufü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 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<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 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<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
, bool
und ITaskItem
ITaskItem[]
. 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 Architecture
Runtime
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 true
zurü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 true
zurü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 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>