编写配置适配器
出于各种原因,你可能希望使用不是 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")
}
- 查看
RegisterAdapter()的 godoc - 查看
Adapter接口 的 godoc
返回的 JSON 不应该进行缩进;它应始终是紧凑的。调用方如果需要可以自行美化它。
请注意,虽然配置适配器是 Caddy 的插件,但它们不是 Caddy 的模块,因为它们并不集成到配置的某一部分(不过为了方便它们会出现在 list-modules 中)。因此,它们没有 Provision() 或 Validate() 方法,也不遵循模块生命周期的其他部分。它们只需实现 Adapter 接口并注册为适配器即可。
在填充类型为 json.RawMessage(即模块字段)的配置字段时,请使用 JSON() 和 JSONModuleObject() 函数:
caddyconfig.JSON()用于在不嵌入模块名称的情况下对模块值进行 marshal。(通常用于 ModuleMap 字段,其中模块名称作为 map 的键。)caddyconfig.JSONModuleObject()用于将模块名称添加到对象中并对模块值进行 marshal。(几乎在其他所有地方都使用。)
Caddyfile 服务器类型
也可以实现自定义的 Caddyfile 格式。Caddyfile 适配器是一个单一的适配器实现,其默认的“服务器类型”是 HTTP,但在注册时它支持替代的“服务器类型”。例如,HTTP Caddyfile 的注册方式如下:
func init() {
caddyconfig.RegisterAdapter("caddyfile", caddyfile.Adapter{ServerType: ServerType{}})
}
你需要实现 caddyfile.ServerType 接口 并相应地注册你自己的适配器。