goopt
A declarative, struct-tag based CLI framework for Go, with a broad feature set such as hierarchical commands/flags, i18n, shell completion, and validation
About goopt
goopt: a flexible and powerful command-line parser
goopt is a flexible and powerful command-line option parser for Go. It provides a declarative, struct-first approach to building CLIs that are robust, maintainable, and user-friendly.
The library is designed to be intuitive for simple tools and scalable for complex applications, with "batteries-included" features like an advanced help system, a composable validation engine, command lifecycle hooks, and comprehensive internationalization (i18n) support.
Looking for the latest version? goopt v2 is here with major improvements!
Installation (v2)
Version 2 is the recommended version for all new projects.
go get github.com/napalu/goopt/v2
Quick Start (v2)
Define your entire CLI structureâcommands, flags, and descriptionsâusing a single Go struct.
package main
import (
"fmt"
"os"
"github.com/napalu/goopt/v2"
)
type Config struct {
// Global flags
Verbose bool `goopt:"short:v;desc:Enable verbose output"`
// 'create' command with a subcommand
Create struct {
Force bool `goopt:"short:f;desc:Force creation"`
User struct {
Username string `goopt:"short:u;desc:Username;required:true"`
Password string `goopt:"short:p;desc:Password;secure:true"`
} `goopt:"kind:command;name:user;desc:Create user"`
} `goopt:"kind:command;name:create;desc:Create resources"`
}
func main() {
cfg := &Config{}
// Note: In v2, the parser type is simply `Parser`
parser, err := goopt.NewParserFromStruct(cfg)
if err != nil {
fmt.Fprintf(os.Stderr, "Error creating parser: %v\n", err)
os.Exit(1)
}
// Parse returns false on failure or if --help was requested
if !parser.Parse(os.Args) {
// goopt handles printing errors and help text by default
os.Exit(1)
}
// Your application logic here...
if parser.HasCommand("create", "user") {
fmt.Printf("Creating user: %s\n", cfg.Create.User.Username)
}
}
For more examples and advanced guides, please visit the v2 Documentation Site.
Legacy Version (v1.x)
This version is in maintenance mode. For new projects, please use goopt v2.
- Installation (v1):
go get github.com/napalu/goopt@v1 - Documentation (v1)
- Migration Guide to v2
Quick Start (v1)
package main
import (
"os"
"fmt"
"github.comcom/napalu/goopt"
)
// ...Config struct is identical to v2 example...
func main() {
cfg := &Config{}
parser, _:= goopt.NewCmdLineFromStruct(cfg)
if !parser.Parse(os.Args) {
parser.PrintUsage(os.Stdout)
return
}
}
License
goopt is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are welcome! Contributions should be based on open issues (feel free to open one).
Frequently Asked Questions
What is goopt?
goopt is a Command Line library for the Go programming language. A declarative, struct-tag based CLI framework for Go, with a broad feature set such as hierarchical commands/flags, i18n, shell completion, and validation
How do I install goopt?
Install goopt with the Go module system using `go get napalu/goopt`. Check the repository for the current installation instructions.
What category does goopt belong to?
goopt is listed under Command Line, specifically Standard CLI.