前言
一个网站后端的核心功能当然是一个http server,但除了server之外还有其他需要设计的部分,比如生成配置文件啊,第一次使用引导安装啊,重新初始化,迁移数据,导出数据等等,直接运行应用后就启动一个http server并不是最优秀的选择。
因此,本篇blog将带领大家利用Cobra(Cobra 是一个用于创建强大的现代 CLI 应用程序的库。)和Pterm(PTerm 是一个现代的 Go 模块,可轻松美化控制台输出)来构建应用
我们需要实现的效果如下(应用名是test):
test version
显示版本号test server
启动服务器
命令框架
cobra的使用方法请大家自行参阅文档~
首先,我们构建基础命令
1
2
3
4
5
| rootCmd := &cobra.Command{
Use: "test",
Short: "一个测试应用",
Long: "一个测试应用,用来演示",
}
|
Version命令
1
2
3
4
5
6
7
8
| versionCmd := &cobra.Command{
Use: "version",
Short: "版本号",
Long: `获取test的版本信息`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("test v0.1 beta")
},
}
|
Server命令
1
2
3
4
5
6
7
8
| serverCmd := &cobra.Command{
Use: "server",
Short: "启动服务器",
Long: "启动test的服务器服务",
Run: func(cmd *cobra.Command, args []string) {
// 启动服务器...
},
}
|
添加到基础命令
1
2
| rootCmd.AddCommand(versionCmd)
rootCmd.AddCommand(serverCmd)
|
解析
当前完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| package main
import (
"fmt"
"github.com/spf13/cobra"
)
func main() {
rootCmd := &cobra.Command{
Use: "test",
Short: "一个测试应用",
Long: "一个测试应用,用来演示",
}
versionCmd := &cobra.Command{
Use: "version",
Short: "版本号",
Long: `获取test的版本信息`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("test v0.1 beta")
},
}
serverCmd := &cobra.Command{
Use: "server",
Short: "启动服务器",
Long: "启动test的服务器服务",
Run: func(cmd *cobra.Command, args []string) {
// 启动服务器...
},
}
rootCmd.AddCommand(versionCmd)
rootCmd.AddCommand(serverCmd)
rootCmd.Execute()
}
|
编译并运行./test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 一个测试应用,用来演示
Usage:
test [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
server 启动服务器
version 版本号
Flags:
-h, --help help for test
Use "test [command] --help" for more information about a command.
|
可以看到,基础的命令框架已经搭建完成,我们可以通过./test help
,./test version
来测试一下,那么,我们要添加额外的功能只需要添加到子命令中即可,./test server
则是启动主服务的方式
美化输出
后端的信息展示和日志等也是非常重要的,可以帮助我们进行溯源等等,因此我们引入pterm
来美化输出,比如version命令我们可以先用大字美化。
1
2
| pterm.DefaultBigText.WithLetters(putils.LettersFromString("test")).Render()
fmt.Println("test v0.1 beta")
|
又或者是将日志替换成pterm的logger
1
2
3
4
| logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
logger.WithCaller().Debug("我是Debug")
logger.Info("你好呀")
logger.Debug("我是Debug")
|
更多妙用如进度条,选择器,表格等等命令行美化请查找pterm文档,本文仅提供部分思路
后记
本文介绍了构建后端服务器的结构,将单一服务器启动变成支持多功能,大家在开发自己的应用之前就要考虑好架构的设计,功能的拓展,随着时间的堆积才不会让代码越来越臃肿。