2013-07-20 16:11:11 +00:00
[![Build Status ](https://travis-ci.org/codegangsta/cli.png?branch=master )](https://travis-ci.org/codegangsta/cli)
2013-07-15 14:44:17 +00:00
# cli.go
2013-07-15 14:38:47 +00:00
cli.go is simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way.
2013-07-15 01:01:26 +00:00
2013-11-01 14:41:43 +00:00
You can view the API docs here:
http://godoc.org/github.com/codegangsta/cli
2013-07-15 14:38:47 +00:00
## Overview
2013-07-15 14:44:17 +00:00
Command line apps are usually so tiny that there is absolutely no reason why your code should *not* be self-documenting. Things like generating help text and parsing command flags/options should not hinder productivity when writing a command line app.
This is where cli.go comes into play. cli.go makes command line programming fun, organized, and expressive!
## Installation
2014-02-15 11:06:07 +00:00
Make sure you have a working Go environment (go 1.1 is *required* ). [See the install instructions ](http://golang.org/doc/install.html ).
2013-07-15 14:44:17 +00:00
To install cli.go, simply run:
```
2013-07-15 15:06:43 +00:00
$ go get github.com/codegangsta/cli
```
Make sure your PATH includes to the `$GOPATH/bin` directory so your commands can be easily used:
```
export PATH=$PATH:$GOPATH/bin
```
2013-07-20 18:24:01 +00:00
## Getting Started
One of the philosophies behind cli.go is that an API should be playful and full of discovery. So a cli.go app can be as little as one line of code in `main()` .
``` go
package main
2013-11-15 11:51:53 +00:00
import (
"os"
"github.com/codegangsta/cli"
)
2013-07-20 18:24:01 +00:00
func main() {
cli.NewApp().Run(os.Args)
}
```
This app will run and show help text, but is not very useful. Let's give an action to execute and some help documentation:
``` go
package main
2013-11-15 11:51:53 +00:00
import (
"os"
"github.com/codegangsta/cli"
)
2013-07-20 18:24:01 +00:00
func main() {
app := cli.NewApp()
app.Name = "boom"
app.Usage = "make an explosive entrance"
app.Action = func(c *cli.Context) {
println("boom! I say!")
}
app.Run(os.Args)
}
```
Running this already gives you a ton of functionality, plus support for things like subcommands and flags, which are covered below.
2013-07-15 15:06:43 +00:00
## Example
Being a programmer can be a lonely job. Thankfully by the power of automation that is not the case! Let's create a greeter app to fend off our demons of loneliness!
``` go
/* greet.go */
package main
2013-11-15 11:51:53 +00:00
import (
"os"
"github.com/codegangsta/cli"
)
2013-07-15 15:06:43 +00:00
func main() {
2013-07-22 14:47:45 +00:00
app := cli.NewApp()
2013-07-20 18:13:48 +00:00
app.Name = "greet"
app.Usage = "fight the loneliness!"
app.Action = func(c *cli.Context) {
2013-07-15 15:06:43 +00:00
println("Hello friend!")
}
2013-07-20 18:13:48 +00:00
app.Run(os.Args)
2013-07-15 15:06:43 +00:00
}
```
Install our command to the `$GOPATH/bin` directory:
```
$ go install
```
Finally run our new command:
```
$ greet
Hello friend!
2013-07-15 14:44:17 +00:00
```
2013-07-15 14:46:24 +00:00
2013-07-15 15:21:26 +00:00
cli.go also generates some bitchass help text:
2013-07-15 15:19:49 +00:00
```
$ greet help
NAME:
greet - fight the loneliness!
USAGE:
greet [global options] command [command options] [arguments...]
VERSION:
0.0.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS
--version Shows version information
```
### Arguments
2013-07-18 18:58:14 +00:00
You can lookup arguments by calling the `Args` function on cli.Context.
``` go
...
2013-07-20 18:24:01 +00:00
app.Action = func(c *cli.Context) {
2013-07-18 18:58:14 +00:00
println("Hello", c.Args()[0])
}
...
```
2013-07-15 15:19:49 +00:00
### Flags
2013-07-18 18:58:14 +00:00
Setting and querying flags is simple.
``` go
...
2013-07-20 18:24:01 +00:00
app.Flags = []cli.Flag {
2013-07-18 18:58:14 +00:00
cli.StringFlag{"lang", "english", "language for the greeting"},
}
2013-07-20 18:24:01 +00:00
app.Action = func(c *cli.Context) {
2013-07-23 09:16:08 +00:00
name := "someone"
if len(c.Args()) > 0 {
name = c.Args()[0]
}
2013-07-18 18:58:14 +00:00
if c.String("lang") == "spanish" {
2013-07-23 09:17:26 +00:00
println("Hola", name)
2013-07-18 18:58:14 +00:00
} else {
2013-07-23 09:17:26 +00:00
println("Hello", name)
2013-07-18 18:58:14 +00:00
}
}
...
```
2013-07-15 15:19:49 +00:00
2013-11-20 08:10:52 +00:00
#### Alternate Names
You can set alternate (or short) names for flags by providing a comma-delimited list for the Name. e.g.
``` go
app.Flags = []cli.Flag {
cli.StringFlag{"lang, l", "english", "language for the greeting"},
}
```
That flag can then be set with `--lang spanish` or `-l spanish` . Note that giving two different forms of the same flag in the same command invocation is an error.
2013-07-15 15:19:49 +00:00
### Subcommands
2013-07-20 18:24:01 +00:00
Subcommands can be defined for a more git-like command line app.
2013-07-20 22:58:51 +00:00
```go
2013-07-20 22:59:38 +00:00
...
2013-07-20 22:58:51 +00:00
app.Commands = []cli.Command{
{
Name: "add",
ShortName: "a",
Usage: "add a task to the list",
Action: func(c *cli.Context) {
2014-01-08 07:01:35 +00:00
println("added task: ", c.Args().First())
2013-07-20 22:58:51 +00:00
},
},
{
Name: "complete",
ShortName: "c",
Usage: "complete a task on the list",
Action: func(c *cli.Context) {
2014-01-08 07:01:35 +00:00
println("completed task: ", c.Args().First())
2013-07-20 22:58:51 +00:00
},
},
2014-04-16 18:09:14 +00:00
{
Name: "template",
ShortName: "r",
2014-04-16 18:10:13 +00:00
Usage: "options for task templates",
2014-04-16 18:09:14 +00:00
Subcommands: []cli.Command{
{
Name: "add",
Usage: "add a new template",
Action: func(c *cli.Context) {
println("new task template: ", c.Args().First())
},
},
{
Name: "remove",
Usage: "remove an existing template",
Action: func(c *cli.Context) {
println("removed task template: ", c.Args().First())
},
},
},
},
2013-07-20 22:58:51 +00:00
}
2013-07-20 22:59:38 +00:00
...
2013-07-20 22:58:51 +00:00
```
2013-07-15 15:19:49 +00:00
2014-04-12 21:59:41 +00:00
### Bash Completion
You can enable completion commands by setting the EnableBashCompletion
flag on the App object. By default, this setting will only auto-complete to
show an app's subcommands, but you can write your own completion methods for
the App or its subcommands.
```go
...
var tasks = []string{"cook", "clean", "laundry", "eat", "sleep", "code"}
app := cli.NewApp()
app.EnableBashCompletion = true
app.Commands = []cli.Command{
{
Name: "complete",
ShortName: "c",
Usage: "complete a task on the list",
Action: func(c *cli.Context) {
println("completed task: ", c.Args().First())
},
BashComplete: func(c *cli.Context) {
// This will complete if no args are passed
if len(c.Args()) > 0 {
return
}
for _, t := range tasks {
println(t)
}
},
}
}
...
```
#### To Enable
Source the autocomplete/bash_autocomplete file in your .bashrc file while
setting the PROG variable to the name of your program:
`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete`
2013-07-15 14:46:24 +00:00
## About
cli.go is written by none other than the [Code Gangsta ](http://codegangsta.io )