v2中文文档
项目

编写配置适配器

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