文件
一個 專案

編寫配置適配器

由於各種原因,您可能希望使用非 JSON 的格式來配置 Caddy。Caddy 通過配置適配器對此提供一流的支援。

如果您偏好的語言/語法/格式尚不存在適配器,您可以自行編寫一個!

範本

這裡有一個您可以開始使用的範本

package myadapter

import (
	"fmt"

	"github.com/caddyserver/caddy/v2/caddyconfig"
)

func init() {
	caddyconfig.RegisterAdapter("adapter_name", MyAdapter{})
}

// MyAdapter adapts ____ to Caddy JSON.
type MyAdapter struct{
}

// Adapt adapts the body to Caddy JSON.
func (a MyAdapter) Adapt(body []byte, options map[string]interface{}) ([]byte, []caddyconfig.Warning, error) {
	// TODO: parse body and convert it to JSON
	return nil, nil, fmt.Errorf("not implemented")
}

返回的 JSON 不應 縮排;它應始終是緊湊的。呼叫者如果需要,可以隨時美化它。

請注意,雖然配置適配器是 Caddy 的外掛程式,但它們不是 Caddy 的模組,因為它們不整合到配置的任何部分(但為了方便起見,它們會出現在 list-modules 中)。因此,它們沒有 Provision()Validate() 方法,也不遵循模組生命週期的其餘部分。它們只需要實作 Adapter 介面並註冊為適配器。

當填充配置中屬於 json.RawMessage 類型(即模組欄位)的欄位時,請使用 JSON()JSONModuleObject() 函數

  • caddyconfig.JSON() 用於封送處理不嵌入模組名稱的模組值。(通常用於模組名稱是映射鍵的 ModuleMap 欄位。)
  • caddyconfig.JSONModuleObject() 用於封送處理將模組名稱添加到物件的模組值。(幾乎在所有其他地方都使用。)

Caddyfile 伺服器類型

也可以實作自訂的 Caddyfile 格式。Caddyfile 適配器是一個單一適配器實現,其預設「伺服器類型」為 HTTP,但它在註冊時支援其他「伺服器類型」。例如,HTTP Caddyfile 的註冊方式如下

func init() {
	caddyconfig.RegisterAdapter("caddyfile",  caddyfile.Adapter{ServerType: ServerType{}})
}

您需要實作 caddyfile.ServerType 介面 並相應地註冊您自己的適配器。