编写配置适配器
出于各种原因,你可能希望使用非 JSON 的格式来配置 Caddy。Caddy 通过配置适配器对此提供了一流的支持。
如果你喜欢的语言/语法/格式还没有现成的适配器,你可以自己编写一个!
模板
这是一个你可以开始的模板:
package myadapter
import (
"fmt"
"github.com/caddyserver/caddy/v2/caddyconfig"
)
func init() {
caddyconfig.RegisterAdapter("adapter_name", MyAdapter{})
}
// MyAdapter 将 ____ 适配为 Caddy JSON。
type MyAdapter struct{
}
// Adapt 将 body 适配为 Caddy JSON。
func (a MyAdapter) Adapt(body []byte, options map[string]interface{}) ([]byte, []caddyconfig.Warning, error) {
// TODO: 解析 body 并将其转换为 JSON
return nil, nil, fmt.Errorf("not implemented")
}
- 查看
RegisterAdapter()
的 godoc - 查看 'Adapter' 接口的 godoc
返回的 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
接口并相应地注册你自己的适配器。