功能可定義 Azure 開發人員 CLI(azd)擴充功能所能執行的操作,從新增自訂命令到掛接至部署生命週期。 本文將說明如何為 Build a sample extension 快速入門中的 Contoso 資源標註器範例擴充功能新增功能。 你可以把相同的模式套用到任何擴充功能上。
每個能力都需要兩個條件:在capabilities陣列中加入一個項目,以及擴充程式碼中對應的實作。
Note
azd擴充框架已普遍提供。 個別擴充功能或功能可能有自己的預覽狀態。 關於 GA 的詳細資訊,請參閱 Generally Available: Azure Developer CLI (azd) Extension Framework.
可用功能
azd 擴充功能可宣告以下功能:
-
custom-commands:在延伸模組的命名空間下,將新的命令和命令群組新增至azd。 例如,範例擴充功能會加入azd tagger show。 利用此功能來公開使用者直接從命令列執行的任務。 -
lifecycle-events:訂閱azd在執行時所引發的事件,例如preprovision、postprovision或postdeploy。 你的擴充功能會在這些節點執行自訂邏輯,使用者不需要直接呼叫。 例如,範例擴充功能會在建立任何資源之前,檢查preprovision上是否有所需的標籤。 -
service-target-provider: 註冊一個新的部署目標,因此azd知道如何將服務打包並部署到它不支援的主機上。 服務目標對應至host中的azure.yaml值。 例如,你可以新增一個將服務部署到第三方平台或內部主機環境的供應商。 -
framework-service-provider: 註冊語言或框架的支援,因此azd知道如何還原、建置及打包該專案類型。 這對應於language中的azure.yaml值。 例如,你可以為一種預設不識別的語言azd加入 build 支援。 -
provisioning-provider:取代azd在azd provision和azd up期間佈建基礎結構的方式。 不是由內建的 Bicep 或 Terraform 流程決定,而是由你的擴充功能決定會發生什麼事。 例如,你可以整合不同的基礎設施即程式碼工具或自訂部署 API。 -
validation-provider:將針對專案或環境執行的檢查新增至azd驗證管線。 例如,你可以在部署前確認命名慣例、必備標籤或安全設定是否已到位。 -
mcp-server: 將你的擴充功能以模型上下文協定(MCP)工具的形式揭露,AI 代理(如 GitHub Copilot)可以發現並呼叫。 例如,範例擴充可以提供suggest_tags工具。 欲了解更多資訊,請參閱 「新增 MCP 伺服器至擴充功能」。 -
metadata:提供更豐富的指令和組態中繼資料,供azd用來描述你的延伸模組,例如會顯示在說明輸出和 IntelliSense 中的詳細指令描述與組態提示。
本文聚焦於兩種最常見的功能:自訂指令與生命週期事件。 如需了解 mcp-server 功能,請參閱 將 MCP 伺服器新增至擴充功能。 欲了解提供者功能的完整細節,請參閱擴充框架參考。
新增自訂指令
這個 custom-commands 功能讓你的擴充功能能在 的命名空間 azd下註冊新指令。 範例擴充功能已經將這項功能用於 azd tagger show 命令。
在
extension.yaml中宣告該能力。capabilities: - custom-commands使用
azdext.NewExtensionRootCommand輔助程式來建立指令,它會註冊標準的azd旗標和環境變數處理功能,因此您不必手動宣告它們: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 }輔助程式會回傳一個
*ExtensionContext,其中提供標準旗標的已解析值,例如Environment和OutputFormat。 將上下文傳給子命令,並在其RunE處理常式中讀取,而不要重新宣告標準旗標。
訂閱生命週期事件
此功能lifecycle-events允許你的擴充功能在專案及服務生命週期事件中執行自訂邏輯,例如preprovisionpostdeploy。 對於此範例擴充功能,請使用 preprovision 事件確認已先設定所需標籤,再由 azd 佈建任何資源。
在
extension.yaml中宣告該能力。capabilities: - custom-commands - lifecycle-events在你的擴充功能中新增
listen指令。azd呼叫此指令以建立用於事件的雙向連線。 使用建構器azdext.NewExtensionHost註冊你的事件處理者: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 }, } }在你的根指令上註冊該
listen指令:rootCmd.AddCommand(newListenCommand())
當使用者執行 azd provision 或 azd up 時,azd 會叫用您的擴充功能,並在配置資源之前呼叫 preprovision 處理常式。
過濾服務事件
服務事件處理器支援可選的過濾功能,因此你只能處理特定類型的服務。 例如,你可以只處理 prepackage Python 容器應用服務的事件:
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",
},
)
重建與測試
新增功能後,重新建置擴充功能並測試新的行為:
如果你使用監看程式,你所做的變更會自動重新建置。 否則,請手動建造:
azd x build測試能力。 對於生命週期事件,執行觸發該事件的指令,例如
azd provision。