--- tags: - v2 search: boost: 2 --- Subcommands can be defined for a more git-like command line app. ```go package main import ( "fmt" "log" "os" "github.com/urfave/cli/v2" ) func main() { app := &cli.App{ Commands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "add a task to the list", Action: func(cCtx *cli.Context) error { fmt.Println("added task: ", cCtx.Args().First()) return nil }, }, { Name: "complete", Aliases: []string{"c"}, Usage: "complete a task on the list", Action: func(cCtx *cli.Context) error { fmt.Println("completed task: ", cCtx.Args().First()) return nil }, }, { Name: "template", Aliases: []string{"t"}, Usage: "options for task templates", Subcommands: []*cli.Command{ { Name: "add", Usage: "add a new template", Action: func(cCtx *cli.Context) error { fmt.Println("new task template: ", cCtx.Args().First()) return nil }, }, { Name: "remove", Usage: "remove an existing template", Action: func(cCtx *cli.Context) error { fmt.Println("removed task template: ", cCtx.Args().First()) return nil }, }, }, }, }, } if err := app.Run(os.Args); err != nil { log.Fatal(err) } } ```