文档
a project

编写配置适配器

出于各种原因,您可能希望使用非 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 接口,并相应地注册您自己的适配器。