介绍
命令行接口 (CLI) 应用程序是运行在终端或命令提示的软件程序. 用户通过指定命令和收到文本作为反馈与软件进行交互。
CLI 虽然很古老,但因其灵活性、便携性和速度而非常受欢迎. CLI 通常用于各种任务,从文本处理到复杂的系统管理任务,以节省时间和精力。
例如,您可以使用 Go 的内置 flag
包或使用流行的第三方包,如 Cobra 包。
在本教程中,您将学习如何使用流行的Cobra包在Go中构建CLI,然后,您将构建一个CLI应用程序,该应用程序将在指定位置输出时区。
前提条件
您需要满足一些要求才能完全掌握这些概念,并遵循本教程。
- 您已在您的计算机上安装了 最近版本的 Go SDK。 以下是您可以遵循的 步行教程以简化安装过程。
- 您有经验使用 Go 编程语言。
步骤一:建立你的发展环境
在此步骤中,您将学习如何设置您的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.go
的cmd
文件夹中创建一个文件,该文件将包含锅板代码,以便您编辑并运行您的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 应用程序。