References
- spf13/cobra: A Commander for modern Go CLI interactions
- gorilla/mux: A powerful HTTP router and URL matcher for building Go web servers with 🦍 http://www.gorillatoolkit.org/pkg/mux
Utilities
Command
定义子命令 serverCmd,并在 init 方法中挂载至 RootCmd 上,serverCmd 的 RunE 指向方法 serverCmdF。
var serverCmd = &cobra.Command{
Use: "server",
Short: "Run the Mattermost server",
RunE: serverCmdF,
SilenceUsage: true,
}
跟进 serverCmdF 方法,有如下关键代码,根据 configStore 名称,可以猜测 config.NewStore 创建的 Store 应该是用于保存配置文件的,那么 runServer 方法有可能从中读取或修改配置文件。
func serverCmdF(command *cobra.Command, args []string) error {
// ...
configStore, err := config.NewStore(configDSN, !disableConfigWatch)
if err != nil {
return err
}
return runServer(configStore, disableConfigWatch, usedPlatform, interruptChan)
}
app.Option
在 runServer 方法中,首先创建了 app.Option 数组,从名字并不难猜测这是关于 Server 的配置内容的,可是数组内容中的各行看起来更像方法。
options := []app.Option{
app.ConfigStore(configStore),
app.RunJobs,
app.JoinCluster,
app.StartElasticsearch,
app.StartMetrics,
}
找到 Option 定义,确认 Option 是方法类型,且参数为 Server,足够了。
type Option func(s *Server) error
Server
Core Components
首先进行核心组件的初始化,如下图所示
FakeApp
App 作为 Server 的代理。