編寫配置適配器
由於各種原因,您可能希望使用非 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
介面 並相應地註冊您自己的適配器。