编写配置适配器
由于各种原因,您可能希望使用与 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")
}
- 请参阅 godoc 以了解
RegisterAdapter()
- 请参阅 godoc 以了解 'Adapter' 接口
返回的 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
接口 并相应地注册您自己的适配器。