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.
Funktionen definieren, was eine Azure Developer CLI (azd)-Erweiterung tun kann, von dem Hinzufügen von benutzerdefinierten Befehlen zum Verbinden mit dem Bereitstellungslebenszyklus. In diesem Artikel erfahren Sie, wie Sie der Beispielerweiterung Contoso Resource Tagger Funktionen aus der Schnellstartanleitung "Erstellen einer Beispielerweiterung" hinzufügen. Sie können die gleichen Muster auf jede Erweiterung anwenden.
Jede Funktion erfordert zwei Dinge: einen Eintrag im capabilities Array Ihres Erweiterungsmanifests und die entsprechende Implementierung in Ihrem Erweiterungscode.
Note
azd Erweiterungen befinden sich derzeit in der Betaversion.
Verfügbare Funktionen
azd Erweiterungen können die folgenden Funktionen deklarieren:
-
custom-commands: Fügt neue Befehle und Befehlsgruppen unterazddem Namespace Ihrer Erweiterung hinzu. Zum Beispiel fügt die Beispielerweiterungazd tagger showhinzu. Verwenden Sie diese Funktion, um Aufgaben verfügbar zu machen, die Benutzer direkt über die Befehlszeile ausführen. -
lifecycle-events: Abonniert Ereignisse, dieazdwährend der Ausführung auslöst, wiepreprovision,postprovisionoderpostdeploy. Ihre Erweiterung führt an diesen Punkten benutzerdefinierte Logik aus, ohne dass der Benutzer sie direkt aufruft. Zum Beispiel überprüft die Beispielerweiterung, ob aufpreprovisionerforderliche Tags vorhanden sind, bevor Ressourcen erstellt werden. -
service-target-provider: Registriert ein neues Bereitstellungsziel, damitazder weiß, wie ein Dienst auf einem Host verpackt und bereitgestellt wird, der nicht sofort unterstützt wird. Ein Dienstziel entspricht dem Werthostinazure.yaml. Sie können beispielsweise einen Anbieter hinzufügen, der einen Dienst auf einer Drittanbieterplattform oder einer internen Hostingumgebung bereitstellt. -
framework-service-provider: Registriert die Unterstützung für eine Sprache oder ein Framework, sodassazdSie wissen, wie Sie diesen Projekttyp wiederherstellen, erstellen und verpacken können. Dies entspricht demlanguageWert inazure.yaml. Sie könnten beispielsweise Build-Unterstützung für eine Sprache hinzufügen, dieazdstandardmäßig nicht erkennt. -
provisioning-provider: Ersetzt, wieazdwährendazd provisionundazd upInfrastruktur bereitstellt. Anstelle des integrierten Bicep- oder Terraform-Flusses definiert Ihre Erweiterung, was passiert. Sie können beispielsweise ein anderes Infrastruktur-as-Code-Tool oder eine benutzerdefinierte Bereitstellungs-API integrieren. -
validation-provider: Fügt derazd-Validierungspipeline Prüfungen hinzu, die für ein Projekt oder eine Umgebung ausgeführt werden. So können Sie beispielsweise überprüfen, ob Benennungskonventionen, erforderliche Tags oder Sicherheitseinstellungen vorhanden sind, bevor eine Bereitstellung fortgesetzt wird. -
mcp-server: Macht die Funktionalität Ihrer Erweiterung als MCP-Tools (Model Context Protocol) verfügbar, die KI-Agents wie GitHub Copilot ermitteln und aufrufen können. Beispielsweise kann die Beispielerweiterung einsuggest_tagsTool verfügbar machen. Weitere Informationen finden Sie unter Hinzufügen eines MCP-Servers zu einer Erweiterung. -
metadata: Stellt erweiterte Metadaten für Befehle und Konfigurationen bereit, dieazdverwendet, um Ihre Erweiterung zu beschreiben, z. B. detaillierte Befehlsbeschreibungen und Konfigurationshinweise, die in der Hilfeausgabe und in IntelliSense angezeigt werden.
In diesem Artikel werden die beiden am häufigsten verwendeten Funktionen behandelt: benutzerdefinierte Befehle und Lebenszyklusereignisse. Informationen zur mcp-server Funktion finden Sie unter Hinzufügen eines MCP-Servers zu einer Erweiterung. Ausführliche Informationen zu den Anbieterfunktionen finden Sie in der Referenz zum Erweiterungsframework.
Hinzufügen von benutzerdefinierten Befehlen
Mit der custom-commands Funktion können Ihre Erweiterung neue Befehle unter einem Namespace in azdregistrieren. Die Beispielerweiterung verwendet diese Funktion bereits für den azd tagger show Befehl.
Deklarieren Sie die Funktion in
extension.yaml.capabilities: - custom-commandsErstellen Sie Ihre Befehle mithilfe des
azdext.NewExtensionRootCommandHilfsprogramms, das die Standardkennzeichnungenazdund die Umgebungsvariablenbehandlung registriert, sodass Sie sie nicht manuell deklarieren müssen:import "github.com/azure/azure-dev/cli/azd/pkg/azdext" func NewRootCommand() *cobra.Command { rootCmd, extCtx := azdext.NewExtensionRootCommand(azdext.ExtensionCommandOptions{ Name: "tagger", Use: "tagger <command> [options]", Short: "Standardize and report Azure resource tags.", }) rootCmd.AddCommand(newShowCommand(extCtx)) // Add other subcommands here. return rootCmd }Die Hilfsfunktion gibt ein
*ExtensionContextzurück, das die ermittelten Werte der Standard-Flags wieEnvironmentundOutputFormatbereitstellt. Übergeben Sie den Kontext an Ihre Unterbefehle und lesen Sie ihn in derenRunE-Handlern, anstatt die Standard-Flags erneut zu deklarieren.
Abonnieren von Lebenszyklusereignissen
Die lifecycle-events-Möglichkeit ermöglicht Ihrer Erweiterung, benutzerdefinierte Logik während Lebenszyklusereignissen von Projekten und Diensten auszuführen, wie preprovision oder postdeploy. Verwenden Sie für die Beispielerweiterung ein preprovision Ereignis, um sicherzustellen, dass erforderliche Tags festgelegt werden, bevor azd Ressourcen festgelegt werden.
Deklarieren Sie die Funktion in
extension.yaml.capabilities: - custom-commands - lifecycle-eventsFügen Sie Ihrer Erweiterung einen
listenBefehl hinzu.azdruft diesen Befehl auf, um die bidirektionale Verbindung einzurichten, die für Ereignisse verwendet wird. Verwenden Sie denazdext.NewExtensionHostGenerator, um Ihre Ereignishandler zu registrieren:func newListenCommand() *cobra.Command { return &cobra.Command{ Use: "listen", Short: "Starts the extension and listens for azd events.", Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { ctx := azdext.WithAccessToken(cmd.Context()) azdClient, err := azdext.NewAzdClient() if err != nil { return fmt.Errorf("failed to create azd client: %w", err) } defer azdClient.Close() host := azdext.NewExtensionHost(azdClient). WithProjectEventHandler( "preprovision", func(ctx context.Context, args *azdext.ProjectEventArgs) error { fmt.Printf("Verifying required tags for project: %s\n", args.Project.Name) // Add your tag validation logic here. return nil }, ) // Run blocks until azd closes the connection. if err := host.Run(ctx); err != nil { return fmt.Errorf("failed to run extension: %w", err) } return nil }, } }Registrieren Sie den
listenBefehl in Ihrem Stammbefehl:rootCmd.AddCommand(newListenCommand())
Wenn ein Benutzer azd provision oder azd up ausführt, ruft azd Ihre Erweiterung auf und ruft den preprovision-Handler auf, bevor Ressourcen bereitgestellt werden.
Ereignisse des Filterdienstes
Dienstereignishandler unterstützen optionale Filterung, sodass Sie nur bestimmte Diensttypen behandeln. Beispielsweise können Sie das prepackage Ereignis nur für Python Container-App-Dienste behandeln:
host := azdext.NewExtensionHost(azdClient).
WithServiceEventHandler(
"prepackage",
func(ctx context.Context, args *azdext.ServiceEventArgs) error {
fmt.Printf("Packaging service: %s\n", args.Service.Name)
return nil
},
&azdext.ServiceEventOptions{
Host: "containerapp",
Language: "python",
},
)
Neuerstellen und Testen
Nachdem Sie eine Funktion hinzugefügt haben, erstellen Sie die Erweiterung neu, und testen Sie das neue Verhalten:
Wenn Sie den Watcher verwenden, werden Ihre Änderungen automatisch neu gebaut. Andernfalls erstellen Sie manuell:
azd x buildTesten Sie die Funktion. Bei Lebenszyklusereignissen führen Sie einen Befehl aus, der das Ereignis auslöst, z. B.
azd provision.