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 的代理。
