如何在 Go 中使用 Cobra 软件包

介绍

命令行接口 (CLI) 应用程序是运行在终端或命令提示的软件程序. 用户通过指定命令和收到文本作为反馈与软件进行交互。

CLI 虽然很古老,但因其灵活性、便携性和速度而非常受欢迎. CLI 通常用于各种任务,从文本处理到复杂的系统管理任务,以节省时间和精力。

例如,您可以使用 Go 的内置 flag或使用流行的第三方包,如 Cobra 包。

在本教程中,您将学习如何使用流行的Cobra包在Go中构建CLI,然后,您将构建一个CLI应用程序,该应用程序将在指定位置输出时区。

前提条件

您需要满足一些要求才能完全掌握这些概念,并遵循本教程。

步骤一:建立你的发展环境

在此步骤中,您将学习如何设置您的Go开发环境,以便开始构建Cobra-cli应用程序。

设置一个Go开发环境很简单,一旦安装了Go SDK,创建一个新的目录并写下Go代码。

在您的终端上运行此命令以验证您的 Go 安装。

1go version

该命令输出您在计算机上安装的 Go SDK 的版本。

1[secondary_label Output]
2go version go1.20.1 darwin/arm64

您需要为您的 CLI 应用程序创建一个新目录,并使用go mod命令为新的 Go 项目初始化目录。

在终端上运行这些命令,在您的计算机上创建和初始化 CLI 应用程序的新项目。

1mkdir CobraDigitalOcean && cd CobraDigitalOcean
2go mod init CobraDigitalOcean

go mod 命令在指定的工作目录中初始化一个新项目,该命令还在目录中创建一个 go.mod 文件,用于管理项目的依赖性。

1[secondary_label Output]
2go: creating a new go.mod: module CobraDigitalOcean

在此步骤中,您已成功为您的 CLI 应用程序启动了 Go 项目。

步骤2 - 开始Cobra包

在此步骤中,您将学习如何开始使用 Cobra 包来构建 CLI 应用程序。

Cobra (Cobra-cli) 是 Go 生态系统中一个流行的包,为构建现代命令行应用提供了强大而全面的框架,Cobra 包提供了许多功能和功能,简化了在 Go 中构建命令行应用。

Cobra-cli 包是建立在标准库的 **flag**包上,提供更高的抽象水平,同时添加更多的功能。

Kubernetes、Hugo、CockroachDB 和 Traefik 等流行的 CLI 应用程序都是用 Go with the Cobra 包编写的。

您可以在项目工作目录的终端中运行此命令,以安装 Cobra-cli 包。

1go install github.com/spf13/cobra-cli@latest

该命令将Cobra-cli包安装为CLI可执行。

安装包后,您可以使用命令行工具的init命令初始化Cobra CLI项目。

1cobra-cli init

init命令在您的项目工作目录中创建文件,其中包含 Cobra 包的 boilerplate 代码和您的包的名称。

1[secondary_label Output]
2Your Cobra application is ready at
3/Users/chukwuemeriwoukeje/go/src/CobraDigitalOcean/CobraDigitalOcean

您可以使用go CLI 工具的build命令构建新的 Cobra CLI 工具,该命令会将可执行文件输出到您的项目工作目录中。

1go build

您必须使用安装命令安装您的 CLI 包以访问更改并与您的 CLI 应用程序进行交互。

1go install

安装您的 CLI 项目应用程序后,您可以使用命令运行该工具来测试该工具及其功能。

1CobraDigitalOcean.

该命令应该返回生成的文件的使用。

1[secondary_label Output]
2A longer description that spans multiple lines and likely contains
3examples and usage of using your application. For example:
4Cobra is a CLI library for Go that empowers applications.
5This application is a tool to generate the needed files
6to quickly create a Cobra application.

此时命令的输出是由 Cobra-cli 工具生成的,您可以编辑 root.go 文件以更改输出。

您已成功安装了 Cobra 包,并在此步骤中初始化了 Cobra CLI 应用。

步骤 3 - 使用时间包在一个时区中恢复时间

在此步骤中,您将学习如何使用时间包来检索时区中的时间。

由于 CLI 应用程序输出一个时区中的时间,您需要一个返回一个时区的时间函数。

Go 的内置时间包为 与不同的时区工作提供功能)。您可以使用时间包的LoadLocation函数从一个时区字符串中加载位置数据,并使用时间包的现在函数的In函数访问位置中的时间。

cmd目录中使用此命令创建一个time.go文件。

1cd cmd && touch time.go

该命令导航到cmd文件夹并创建time.go文件。

以下是接收一个时区字符串并返回该时区的时间函数。

 1[label cmd/time.go]
 2package time
 3import "time"
 4
 5func getTimeInTimezone(timezone string) (string, error) {
 6 location, err := time.LoadLocation(timezone)
 7 if err != nil {
 8  return ", err
 9 }
10 currentTime := time.Now().In(location)
11 return currentTime.Format(time.RFC1123), nil
12}

该程序导入了getTimeInTimezone函数的时间包,该getTimeInTimezone函数将一个时区字符串输入并以字符串格式返回当前时间和错误。

当前时间实例的格式函数根据 RFC1123 标准格式时间。

在此步骤中,您已设置了返回时间包时区位置的时间函数。

步骤 4 - 将命令添加到您的 Cobra 应用程序中

在此步骤中,您将学习如何将命令添加到您的Cobra CLI应用程序中。

您可以使用 Cobra-cli 的添加命令将命令添加到 CLI 应用程序中,您需要指定命令的名称作为额外的参数。

在 Cobra-cli 项目的终端上运行此命令,将名为 timezone 的命令添加到应用程序中。

1cobra-cli add timezone

该命令应该在存在root.gocmd文件夹中创建一个文件,该文件将包含锅板代码,以便您编辑并运行您的CLI应用程序。

1[secondary_label Output]
2timezone created at /Users/chukwuemeriwoukeje/go/src/CobraDigitalOcean/CobraDigitalOcean

您将编辑该文件以匹配您的 CLI 项目。‘timeZoneCmd’变量是 cobra 命令的实例。‘Use’字段指示命令名称,而‘Short’和‘Long’字段指示命令的短篇和长篇描述。

运行字段是当您在 CLI 应用程序上执行命令时运行的函数。

以下是编辑的timezoneCmd变量,其中包含符合时区命令功能的字段。

 1[label cmd/timezone.go]
 2// timezoneCmd represents the timezone command
 3
 4var timezoneCmd = &cobra.Command{
 5 Use:   "timezone",
 6 Short: "Get the current time in a given timezone",
 7 Long: `Get the current time in a given timezone.
 8               This command takes one argument, the timezone you want to get the current time in.
 9               It returns the current time in RFC1123 format.`,
10 Args: cobra.ExactArgs(1),
11 Run: func(cmd *cobra.Command, args []string) {
12  timezone := args[0]
13  currentTime, err := getTimeInTimezone(timezone)
14  if err != nil {
15   log.Fatalln("The timezone string is invalid")
16  }
17  fmt.Println(currentTime)
18 },
19}

该程序定义了使用运行字段,这些字段符合时区函数的功能,而timezoneString变量是args字段中包含用户输入的额外参数的额外参数。

简单地运行去安装命令来构建和安装测试的 CLI 工具。

1go install

随后,按时间表时间表执行。

1CobraDigitalOcean timezone EST

以下是执行命令请求美国时间的结果(时区字符串EST)

1[secondary_label Output]
2Sat, 11 Mar 2023 06:57:23 EST

在此步骤中,您已经学会了如何将命令和它们的功能用于您的 CLI 应用程序。

步骤5 - 将旗帜添加到您的Cobra应用程序

在此步骤中,您将学习如何在您的 CLI 应用程序中添加本地和持久的旗帜。

旗帜是修改命令行为的选项.一个字符串或两个字符串通常先于旗帜(---).旗帜为用户提供了一个方便的方式来修改命令的行为,而无需修改源代码或重新编译程序。

您可以在命令文件的init函数中添加旗帜,此外,cobra 还提供功能来为您的应用程序添加本地和永久旗帜。

局域旗只适用于它们定义的命令,而局域旗不由子命令继承,也不适用于同一级别的命令。

另一方面,您可以在命令的根级别定义永久性旗帜,以便子命令继承。

在 init 函数中,您可以使用命令实例(timezoneCmd)的PersistentFlags函数添加持久旗帜到您的应用程序中,您可以使用PersistentFlags函数的String函数添加有关旗帜的信息。

1[label cmd/timezone.go]
2func init() {
3  rootCmd.AddCommand(timezoneCmd)
4  timezoneCmd.PersistentFlags().String("date", "", "returns the date in a time zone in a specified format")
5}

同样,您可以使用Flags函数添加本地旗帜,并使用String函数添加有关旗帜的信息。

1[label cmd/timezone.go]
2func init() {
3  rootCmd.AddCommand(timezoneCmd)
4  timezoneCmd.Flags().String("date", "", "Date for which to get the time (format: yyyy-mm-dd)")
5
6}

init函数中添加旗的信息后,您可以在命令实例的运行函数中添加旗的功能。

您可以使用Flags函数访问来自旗帜的数据,并使用GetString函数访问旗帜的字符串值,该函数将旗帜的名称列入并返回字符串和错误。

以下是用于时区命令的函数,该函数从日期标志访问字符串,并只返回指定格式的日期。

 1[label cmd/timezone.go]
 2Run: func(cmd *cobra.Command, args []string) {
 3  timezone := args[0]
 4  location, _ := time.LoadLocation(timezone)
 5  dateFlag, _ := cmd.Flags().GetString("date")
 6  var date string
 7
 8  if dateFlag != "" {
 9   date = time.Now().In(location).Format(dateFlag)
10  } else {
11   date = time.Now().In(location).Format(time.RFC3339)[:10]
12  }
13  fmt.Printf("Current date in %v: %v\n", timezone, date)
14 }

该函数访问命令和旗帜,将时区的位置加载到时间包中,访问时区中的时间,并使用字符串格式词汇检索日期。

再次运行去安装命令以更新您的 CLI 应用程序的功能。

以下是如何在您的 CLI 应用程序中使用旗帜。

1CobraDigitalOcean timezone EST --date 2006-01-02

该命令将日期格式指定为 YYYY-MM-DD,输出应该是所规定的格式中该时区的当前日期。

1[secondary_label Output]
2The current date in EST: 2023-03-11

在此步骤中,您了解如何在您的 CLI 应用程序中添加持久和本地旗帜。

结论

您已经了解了 CLI,Cobra 包,如何使用 Go 内置的时间包与时区工作,以及如何使用 Cobra-cli 工具构建 CLI 应用程序。

Cobra 对您的开发武器库至关重要,因为您可以在几分钟内构建 CLI 应用程序。

Published At
Categories with 技术
Tagged with
comments powered by Disqus