213 lines
5.0 KiB
Markdown
213 lines
5.0 KiB
Markdown
# CLI Patterns Examples Index
|
|
|
|
Comprehensive examples demonstrating urfave/cli patterns in production-ready applications.
|
|
|
|
## Example Applications
|
|
|
|
### 1. Database CLI Tool (`db-cli/`)
|
|
|
|
**Purpose**: Complete database management CLI with categories, hooks, and connection handling.
|
|
|
|
**Features**:
|
|
- Command categories (Schema, Data, Admin)
|
|
- Before hook for connection validation
|
|
- After hook for cleanup
|
|
- Required and optional flags
|
|
- Environment variable fallbacks
|
|
|
|
**Commands**:
|
|
- `migrate` - Run migrations with direction and steps
|
|
- `rollback` - Rollback last migration
|
|
- `seed` - Seed database with test data
|
|
- `backup` - Create database backup
|
|
- `restore` - Restore from backup
|
|
- `status` - Check database status
|
|
- `vacuum` - Optimize database
|
|
|
|
**Key Patterns**:
|
|
```go
|
|
// Connection validation in Before hook
|
|
Before: func(c *cli.Context) error {
|
|
conn := c.String("connection")
|
|
// Validate connection
|
|
return nil
|
|
}
|
|
|
|
// Cleanup in After hook
|
|
After: func(c *cli.Context) error {
|
|
// Close connections
|
|
return nil
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2. Deployment CLI Tool (`deploy-cli/`)
|
|
|
|
**Purpose**: Deployment automation with context management and environment validation.
|
|
|
|
**Features**:
|
|
- Context management with shared state
|
|
- Environment validation
|
|
- Confirmation prompts for destructive actions
|
|
- AWS region configuration
|
|
- Build, deploy, and monitor workflows
|
|
|
|
**Commands**:
|
|
- `build` - Build application with tags
|
|
- `test` - Run test suite
|
|
- `deploy` - Deploy to environment (with confirmation)
|
|
- `rollback` - Rollback to previous version
|
|
- `logs` - View deployment logs
|
|
- `status` - Check deployment status
|
|
|
|
**Key Patterns**:
|
|
```go
|
|
// Shared context across commands
|
|
type DeployContext struct {
|
|
Environment string
|
|
AWSRegion string
|
|
Verbose bool
|
|
}
|
|
|
|
// Store context in Before hook
|
|
ctx := &DeployContext{...}
|
|
c.App.Metadata["ctx"] = ctx
|
|
|
|
// Retrieve in command
|
|
ctx := c.App.Metadata["ctx"].(*DeployContext)
|
|
```
|
|
|
|
---
|
|
|
|
### 3. API Client CLI Tool (`api-cli/`)
|
|
|
|
**Purpose**: REST API client with HTTP client sharing and authentication.
|
|
|
|
**Features**:
|
|
- HTTP client sharing via context
|
|
- Authentication in Before hook
|
|
- Multiple HTTP methods (GET, POST, PUT, DELETE)
|
|
- Request timeout configuration
|
|
- Token masking for security
|
|
|
|
**Commands**:
|
|
- `get` - GET request with headers
|
|
- `post` - POST request with data
|
|
- `put` - PUT request with data
|
|
- `delete` - DELETE request
|
|
- `auth-test` - Test authentication
|
|
|
|
**Key Patterns**:
|
|
```go
|
|
// HTTP client in context
|
|
type APIContext struct {
|
|
BaseURL string
|
|
Token string
|
|
HTTPClient *http.Client
|
|
}
|
|
|
|
// Initialize in Before hook
|
|
client := &http.Client{Timeout: timeout}
|
|
ctx := &APIContext{
|
|
HTTPClient: client,
|
|
...
|
|
}
|
|
|
|
// Use in commands
|
|
ctx := c.App.Metadata["ctx"].(*APIContext)
|
|
resp, err := ctx.HTTPClient.Get(url)
|
|
```
|
|
|
|
---
|
|
|
|
## Pattern Summary
|
|
|
|
### Context Management
|
|
All three examples demonstrate different context patterns:
|
|
- **db-cli**: Connection validation and cleanup
|
|
- **deploy-cli**: Shared deployment configuration
|
|
- **api-cli**: HTTP client and authentication sharing
|
|
|
|
### Before/After Hooks
|
|
- **Before**: Setup, validation, authentication, connection establishment
|
|
- **After**: Cleanup, resource release, connection closing
|
|
|
|
### Command Categories
|
|
Organized command groups for better UX:
|
|
- **db-cli**: Schema, Data, Admin
|
|
- **deploy-cli**: Build, Deploy, Monitor
|
|
- **api-cli**: No categories (simple HTTP verbs)
|
|
|
|
### Flag Patterns
|
|
- Required flags: `--connection`, `--env`, `--token`
|
|
- Environment variables: All support env var fallbacks
|
|
- Aliases: Short forms (-v, -e, -t)
|
|
- Multiple values: StringSlice for headers
|
|
- Custom types: Duration for timeouts
|
|
|
|
### Error Handling
|
|
All examples demonstrate:
|
|
- Validation in Before hooks
|
|
- Proper error returns
|
|
- User-friendly error messages
|
|
- Exit code handling
|
|
|
|
## Running the Examples
|
|
|
|
### Database CLI
|
|
```bash
|
|
export DATABASE_URL="postgres://user:pass@localhost/mydb"
|
|
cd examples/db-cli
|
|
go build -o dbctl .
|
|
./dbctl migrate
|
|
./dbctl backup --output backup.sql
|
|
```
|
|
|
|
### Deployment CLI
|
|
```bash
|
|
export DEPLOY_ENV=staging
|
|
export AWS_REGION=us-east-1
|
|
cd examples/deploy-cli
|
|
go build -o deploy .
|
|
./deploy build --tag v1.0.0
|
|
./deploy deploy
|
|
```
|
|
|
|
### API Client CLI
|
|
```bash
|
|
export API_URL=https://api.example.com
|
|
export API_TOKEN=your_token_here
|
|
cd examples/api-cli
|
|
go build -o api .
|
|
./api get /users
|
|
./api post /users '{"name":"John"}'
|
|
```
|
|
|
|
## Learning Path
|
|
|
|
**Beginner**:
|
|
1. Start with `db-cli` - demonstrates basic categories and hooks
|
|
2. Study Before/After hook patterns
|
|
3. Learn flag types and validation
|
|
|
|
**Intermediate**:
|
|
4. Study `deploy-cli` - context management and shared state
|
|
5. Learn environment validation
|
|
6. Understand confirmation prompts
|
|
|
|
**Advanced**:
|
|
7. Study `api-cli` - HTTP client sharing and authentication
|
|
8. Learn complex context patterns
|
|
9. Understand resource lifecycle management
|
|
|
|
## Cross-Language Comparison
|
|
|
|
Each example can be implemented in other languages:
|
|
- **TypeScript**: Use commander.js (see templates/)
|
|
- **Python**: Use click or typer (see templates/)
|
|
- **Ruby**: Use thor
|
|
- **Rust**: Use clap
|
|
|
|
The patterns translate directly across languages with similar CLI frameworks.
|