• 【34】cobra 框架


    一. cobra是什么

    cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架,用于生成基于 cobra 的应用程序框架。非常多知名的开源项目使用了 cobra 库构建命令行,如Kubernetes、Hugo、etcd等等等等。

    二. 引入cobra库

    go get -u github.com/spf13/cobra

    三. go示例代码

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/spf13/cobra"
    5. "os"
    6. "strings"
    7. )
    8. var (
    9. Verbose bool
    10. ConfigPath string
    11. SomeString string
    12. )
    13. func main() {
    14. Execute()
    15. return
    16. }
    17. var rootCmd = &cobra.Command{
    18. Use: "root",
    19. Short: "the short description shown in the 'help' output.",
    20. Long: `root description detail
    21. Long is the long message shown in the 'help ' output.`,
    22. Run: func(cmd *cobra.Command, args []string) {
    23. // Do Stuff Here
    24. fmt.Printf("root verbose: %v\n", Verbose)
    25. fmt.Printf("root config: %s\n", ConfigPath)
    26. fmt.Printf("root string: %s\n", SomeString)
    27. },
    28. }
    29. func Execute() {
    30. if err := rootCmd.Execute(); err != nil {
    31. fmt.Println(err)
    32. os.Exit(1)
    33. }
    34. }
    35. var apiCmd = &cobra.Command{
    36. Use: "api",
    37. Short: "api short description",
    38. Long: `api long description`,
    39. Run: func(cmd *cobra.Command, args []string) {
    40. // Do Stuff Here
    41. fmt.Printf("api verbose: %v\n", Verbose)
    42. fmt.Printf("api config: %s\n", ConfigPath)
    43. fmt.Printf("api string: %s\n", SomeString)
    44. },
    45. }
    46. var adminCmd = &cobra.Command{
    47. Use: "admin",
    48. Short: "admin short description",
    49. Long: `admin long description`,
    50. Run: func(cmd *cobra.Command, args []string) {
    51. // Do Stuff Here
    52. fmt.Printf("admin verbose: %v\n", Verbose)
    53. fmt.Printf("admin config: %s\n", ConfigPath)
    54. fmt.Printf("admin string: %s\n", SomeString)
    55. },
    56. }
    57. var apiChildCmd = &cobra.Command{
    58. Use: "apiChild",
    59. Short: "apiChild short description",
    60. Long: `apiChild long description`,
    61. Run: func(cmd *cobra.Command, args []string) {
    62. // Do Stuff Here
    63. fmt.Printf("apiChild verbose: %v\n", Verbose)
    64. fmt.Printf("apiChild config: %s\n", ConfigPath)
    65. fmt.Printf("apiChild string: %s\n", SomeString)
    66. },
    67. }
    68. func init() {
    69. rootCmd.AddCommand(apiCmd, adminCmd)
    70. apiCmd.AddCommand(apiChildCmd)
    71. // persistent是全局选项,对应的方法为PersistentFlags
    72. rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "全局版本")
    73. rootCmd.PersistentFlags().StringVarP(&SomeString, "string", "s", "null", "字符串")
    74. // local为本地选项,对应方法为Flags,只对指定的Command生效
    75. apiCmd.Flags().StringVarP(&ConfigPath, "config", "c", "", "读取文件路径")
    76. }

        // persistent是全局选项,对应的方法为PersistentFlags
        rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "全局版本")
        rootCmd.PersistentFlags().StringVarP(&SomeString, "string", "s", "null", "字符串")
        // local为本地选项,对应方法为Flags,只对指定的Command生效
        apiCmd.Flags().StringVarP(&ConfigPath, "config", "c", "", "读取文件路径")

    四. 结果

    1. go run ./main.go -v -s aaa
    2. root verbose: true
    3. root config:
    4. root string: aaa
    1. go run ./main.go api -v -s aaa -c config
    2. api verbose: true
    3. api config: config
    4. api string: aaa
    1. go run ./main.go api apiChild -v -s aaa
    2. apiChild verbose: true
    3. apiChild config:
    4. apiChild string: aaa

    只有api可以设置-c参数

    五. 添加svc库

    svc库将服务分为初始化、启动服务、结束服务三个阶段。

    引入svc包

    go get -u github.com/judwhite/go-svc

    与cobra结合,如下为项目启动示例代码

    1. func main() {
    2. Execute()
    3. return
    4. }
    5. var rootCmd = &cobra.Command{
    6. Use: "server",
    7. Short: "",
    8. Long: "",
    9. Run: func(cmd *cobra.Command, args []string) {
    10. },
    11. }
    12. func Execute() {
    13. if err := rootCmd.Execute(); err != nil {
    14. fmt.Println(err)
    15. os.Exit(1)
    16. }
    17. }
    18. type Application struct {
    19. }
    20. var cfgFile *string
    21. var startCmd = &cobra.Command{
    22. Use: "start",
    23. Short: "start the api server",
    24. Long: `usage example:
    25. server(.exe) start -c apollo.json
    26. start the server`,
    27. Run: func(cmd *cobra.Command, args []string) {
    28. app := &Application{}
    29. if err := svc.Run(app, syscall.SIGINT, syscall.SIGTERM); err != nil {
    30. fmt.Println(err)
    31. }
    32. },
    33. }
    34. func init() {
    35. rootCmd.AddCommand(startCmd)
    36. cfgFile = startCmd.Flags().StringP("config", "c", "", "config file (required)")
    37. startCmd.MarkFlagRequired("config")
    38. }
    39. func (app *Application) Init(env svc.Environment) error {
    40. // do init
    41. return nil
    42. }
    43. func (app *Application) Start() error {
    44. // do start
    45. return nil
    46. }
    47. func (app *Application) Stop() error {
    48. // do stop
    49. return nil
    50. }

  • 相关阅读:
    让业务满意的性能测试报告模板应该是怎样的?
    GIT相关内容总结
    微服务框架 案例
    SQL注入类型(详细讲解)
    聚酰胺-胺(PAMAM)树形聚合物-硫化铋复合纳米粒子|硫化铋修饰Gd‑DTPA‑OA配体|科研实验用
    股权重组是指什么
    【uni-app系列】uni-app从0到1开发实例
    linux安全--DNS服务部署
    这些比较前沿的设计网站,你知道吗?
    Chapter8.1:非线性控制系统分析
  • 原文地址:https://blog.csdn.net/chen_peng7/article/details/133522004