点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章
连载了十一篇,终于讲到了大家最关心的Caddy的插件开发。插件开发是一种提供给我们开发者定制化Caddy的能力,让我们可以根据自己的需求,通过插件的机制,扩展Caddy的功能,满足自己的需求。
在Caddy中,编写插件是非常容易的事情,这得益于Caddy模块化的架构。其实我们用到的很多指令功能,都是Caddy基于插件实现,这些官方实现的插件,称之为标准插件。
在Caddy中,是没有插件这个概念的,Caddy称之为模块,其实和插件是一样的,而我们对插件也更容易理解,所以我会沿用插件这个概念。
xcaddy
要开发Caddy插件,xcaddy是必不可少的利器,通过它你可以把自己想用的插件编译进Caddy中,生成你专属的Caddy二进制文件,这样这个Caddy二进制文件就包含了你想用的插件。是不是很方便?它提供了让你定制Caddy二进制文件的能力,是否需要额外的插件完全取决于你。
在使用xcaddy之前,你得先安装它,你可以从 https://github.com/caddyserver/xcaddy/releases 下载在二进制文件,也可以可以通过源代码安装它,因为它是开源的。
$ go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
实现一个插件
要想开发一个插件,那么这个插件必须要实现 caddy.Module
接口,这个接口非常简单,只有一个 CaddyModule
方法:
type Module interface {
CaddyModule() ModuleInfo
}
现在我们来开发我们自己的插件HelloWorld,首先先定义一个结构体实现caddy.Module
接口 。
type HelloWorld struct {
}
func (h HelloWorld) CaddyModule() caddy.ModuleInfo {
return caddy.ModuleInfo{
ID: "http.handlers.hello_world",
New: func() caddy.Module { return new(HelloWorld) },
}
}
从以上代码可以看到,我们返回的 caddy.ModuleInfo
包含两个字段:
ID