Go CLI Builder (V2)
A lightweight and flexible declarative library for building command-line interfaces (CLIs)
in Go. This library provides a simple and intuitive way to define commands,
flags (including short names), aliases and more using struct tags.
⚠️ Migration to V2
Version 2.0 is a complete rewrite. It moves from an imperative approach (calling methods to add flags) to a declarative, code-first approach (using struct tags).
V1 code is not compatible with V2. Please refer to the Basic Usage section to see the new pattern.
Features
- Declarative Command Definition: Define commands and flags using struct tags (
cmd,cli,arg,help).
- Type-Safe Flag Handling: Automatically binds flags to basic types (
int,bool,string,time.Duration,[]string) and structs.
- Dependency Injection: Automatically injects
LoggerandContextinto your commands via embedding.
- Environment Variable Integration: Map environment variables directly to flags using the
env:"VAR_NAME"tag.
- Built-in Help Generation: Automatically generates formatted help messages based on your structs and tags.
- Customizable Logging: Includes a built-in logger (
Info,Success,Warning,Error) available in every command.
- Lifecycle Hooks: Supports
Before()andAfter()methods for command initialization and cleanup.
Getting Started
Installation
go get github.com/mirkobrombin/go-cli-builder/v2
Basic Usage
package main
import (
"fmt"
"os"
"github.com/mirkobrombin/go-cli-builder/v2/pkg/cli"
)
// Define your root CLI struct
type CLI struct {
// Global flags
Verbose bool `cli:"verbose,v" help:"Enable verbose output" env:"VERBOSE"`
// Subcommands
Add AddCmd `cmd:"add" help:"Add a new item"`
List ListCmd `cmd:"list" help:"List all items"`
// Embed Base to get Logger and Context
cli.Base
}
// Optional: Lifecycle hook
func (c *CLI) Before() error {
if c.Verbose {
c.Logger.Info("Verbose mode enabled")
}
return nil
}
type AddCmd struct {
Item string `arg:"" required:"true" help:"Item to add"`
cli.Base
}
// Run is the entry point for the command
func (c *AddCmd) Run() error {
c.Logger.Success("Adding item: %s", c.Item)
return nil
}
type ListCmd struct {
cli.Base
}
func (c *ListCmd) Run() error {
c.Logger.Info("Listing items...")
return nil
}
func main() {
app := &CLI{}
// Run the app - the library handles parsing, binding, and execution
if err := cli.Run(app); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
}
Documentation
For more detailed examples, check the examples/v2 directory.
License
This project is licensed under the MIT License. See the LICENSE file
for details.