Bạn muốn viết 1 tool command như bạn chỉ biết golang.
Ahihi quá easy
Look into example
https://github.com/urfave/cli/blob/main/docs/v2/examples/greet.md
package main import ( "fmt" "log" "os" "github.com/urfave/cli/v2" ) func main() { app := &cli.App{ Name: "greet", Usage: "fight the loneliness!", Action: func(*cli.Context) error { fmt.Println("Hello friend!") return nil }, } if err := app.Run(os.Args); err != nil { log.Fatal(err) } }
trong phần import github.com/urfave/cli/v2 thì the urfave/cli
package to create a command-line application.
Tiếp đến là phần khai báo các thông tin của CLI thông qua &cli.App:
Name
: The name of the application is set to “greet”.Usage
: A short description of the application is provided: “fight the loneliness!”.Action
: Defines the action to be performed when this app is executed. In this case, it’s an anonymous function that prints “Hello friend!” to the console. The function returnsnil
to indicate that it executed successfully.
Tiếp đến là phần thực thi application:
app.Run(os.Args)
app
: This is an instance ofcli.App
, which represents the command-line application itself. It contains all the metadata (like name and usage) and configurations (like flags, commands, and actions) that define how the app behaves..Run()
: This is a method of thecli.App
struct. It’s responsible for parsing the command-line arguments, handling any specified commands, and invoking the appropriate actions based on the user’s input.os.Args
: This is a slice of strings provided by the Go standard library’sos
package. It contains all the command-line arguments passed to the program when it’s executed. The first element (os.Args[0]
) is always the path to the executed program, and the rest are the arguments and flags passed by the user.
Và đây là thành quả khi bạn go build -o greet và sau đó bạn run file greet help
$ greet help NAME: greet - fight the loneliness! USAGE: greet [global options] command [command options] [arguments...] COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS --help, -h show help (default: false)
Provide a CLI tool for yourself.
Để hiểu được lý do mình muốn viết cli.
Ban đầu bạn sẽ cần thực thi một công việc gì đó. mình viết bash script. sau đó thì các hàm này gọi hàm kia.
Bash script phức tạp và rối rắm.
It’s high time I needed to code the cli tool.
Bạn cần divide (chia) into each part.
https://github.com/mrnim94/learn_cli/blob/master/main.go
package main import ( "github.com/urfave/cli/v2" "learn_cli/learn_command" "log" "os" ) func main() { app := &cli.App{ Name: "greeter", Usage: "A simple CLI application", Commands: []*cli.Command{ learn_command.GreetCommand(), learn_command.CreatePostCommand(), }, } err := app.Run(os.Args) if err != nil { log.Fatal(err) } }
Bạn sẽ thấy main function will call đến 2 command:learn_command.GreetCommand()
và learn_command.CreatePostCommand()
Việc divide functions hoặc files rất là quan trong nếu tool của chúng ta ngày càng lớn.
Nếu tát cả viết hết trên 1 file thì khách gì viết script.
Tiếp tục tìm hiểu chi tiết các commands:
package learn_command import ( "github.com/urfave/cli/v2" "learn_cli/learn_action" ) func GreetCommand() *cli.Command { return &cli.Command{ Name: "greet", Aliases: []string{"g"}, Usage: "greets a user", Flags: []cli.Flag{ &cli.StringFlag{ Name: "name", Value: "", Usage: "the name of the person to greet", }, &cli.IntFlag{ Name: "age", Value: 0, Usage: "the age of the person", }, }, Action: learn_action.GreetAction, } }
Bạn có thể thiểu đơn giản như thế này:
Mình tạo file learn_cli.exe (vì mình chạy trên windows)
Mình mong muốn command sẽ là learn_cli.exe greet –name nim –age 30
thì bạn sẽ triển khai funtion như trên.
Tiếp đến nó sẽ gọi đến action là learn_action.GreetAction
Vậy trong file command có gì?
package learn_action import ( "fmt" "github.com/urfave/cli/v2" ) func GreetAction(c *cli.Context) error { name := c.String("name") if name == "" { name = "World" // Default value if no name is provided } age := c.Int("age") greeting := fmt.Sprintf("Hello, %s!", name) if age > 0 { greeting += fmt.Sprintf(" You are %d years old.", age) } fmt.Println(greeting) return nil }
Nó sẽ ghi nhận các flags mà bạn truyền vào thông qua command và thực hiện sử lý ở đây.
Ví dụ bạn truyền vào là xxxx –name nim.
thì chúng ta có 1 logic để kiêm tra điều này:
name := c.String("name")
if name == "" {
name = "World" // Default value if no name is provided
}
age := c.Int("age")
Ngoài ra nếu bạn muốn command là
learn_cli.exe post create –title golang –content ahihi
thì bạn có thể tìm hiểu 2 files:
https://github.com/mrnim94/learn_cli/blob/master/learn_command/post.go