Baike.dev
All toolsTrendingOpen sourceNewsSubmit
Log in
< 返回工具列表
K

kong

> 编程语言
开源

Kong is a command-line parser for Go

44.1K stars0 点赞0 次浏览
访问官网GitHub

工具介绍

Kong is a command-line parser for Go

# Kong is a command-line parser for Go [](https://circleci.com/gh/alecthomas/kong) [](https://goreportcard.com/report/github.com/alecthomas/kong) [](https://gophers.slack.com/messages/CN9DS8YF3) - [Version 1.0.0 Release](#version-100-release) - [Introduction](#introduction) - [Help](#help) - [Help as a user of a Kong application](#help-as-a-user-of-a-kong-application) - [Defining help in Kong](#defining-help-in-kong) - [Command handling](#command-handling) - [Switch on the command string](#switch-on-the-command-string) - [Attach a `Run(...) error` method to each command](#attach-a-run-error-method-to-each-command) - [Hooks: BeforeReset(), BeforeResolve(), BeforeApply(), AfterApply()](#hooks-beforereset-beforeresolve-beforeapply-afterapply) - [The Bind() option](#the-bind-option) - [Flags](#flags) - [Commands and sub-commands](#commands-and-sub-commands) - [Branching positional arguments](#branching-positional-arguments) - [Positional arguments](#positional-arguments) - [Slices](#slices) - [Maps](#maps) - [Pointers](#pointers) - [Nested data structure](#nested-data-structure) - [Custom named decoders](#custom-named-decoders) - [Supported field types](#supported-field-types) - [Custom decoders (mappers)](#custom-decoders-mappers) - [Supported tags](#supported-tags) - [Plugins](#plugins) - [Dynamic Commands](#dynamic-commands) - [Variable interpolation](#variable-interpolation) - [Validation](#validation) - [Modifying Kong's behaviour](#modifying-kongs-behaviour) - [`Name(help)` and `Description(help)` - set the application name description](#namehelp-and-descriptionhelp---set-the-application-name-description) - [`Configuration(loader, paths...)` - load defaults from configuration files](#configurationloader-paths---load-defaults-from-configuration-files) - [`Resolver(...)` - support for default values from external sources](#resolver---support-for-default-values-from-external-sources) - [`*Mapper(...)` - customising how the command-line is mapped to Go values](#mapper---customising-how-the-command-line-is-mapped-to-go-values) - [`ConfigureHelp(HelpOptions)` and `Help(HelpFunc)` - customising help](#configurehelphelpoptions-and-helphelpfunc---customising-help) - [Injecting values into `Run()` methods](#injecting-values-into-run-methods) - [Other options](#other-options) ## Version 1.0.0 Release Kong has been stable for a long time, so it seemed appropriate to cut a 1.0 release. There is one breaking change, [#436](https://github.com/alecthomas/kong/pull/436), which should effect relatively few users. ## Introduction Kong aims to support arbitrarily complex command-line structures with as little developer effort as possible. To achieve that, command-lines are expressed as Go types, with the structure and tags directing how the command line is mapped onto the struct. For example, the following command-line: shell rm [-f] [-r] ... shell ls [ ...] Can be represented by the following command-line structure: ```go package main import "github.com/alecthomas/kong" var CLI struct { Rm struct { Force bool `help:"Force removal."` Recursive bool `help:"Recursively remove files."` Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` } `cmd:"" help:"Remove files."` Ls struct { Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` } `cmd:"" help:"List paths."` } func main() { ctx := kong.Parse(&CLI) switch ctx.Command() { case "rm ": case "ls": default: panic(ctx.Command()) } } ``` ## Help ### Help as a user of a Kong application Every Kong application includes a `--help` flag that will display auto-generated help. eg. $ shell --help usage: shell A shell-like example app. Flags: --help Show context-sensitive help. --debug Debug mode. Commands: rm ... Remove files. ls [ ...] List paths. If a command is provided, the help will show full detail on the command including all available flags. eg. $ shell --help rm usage: shell rm ... Remove files. Arguments: ... Paths to remove. Flags: --debug Debug mode. -f, --force Force removal. -r, --recursive Recursively remove files. ### Defining help in Kong Help is automatically generated from the command-line structure itself, including `help:""` and other tags. [Variables](#variable-interpolation) will also be interpolated into the help string. Finally, any command, or argument type implementing the interface `Help() string` will have this function called to retrieve more detail to augment the help tag. This allows for much more descriptive text than can fit in Go tags. [See \_examples/shell/help](./_examples/shell/help) #### Showing the _command_'s detailed help A command's additional help text is _not_ shown from top-level help, but can be displayed within contextual help: **Top level help** ```bash $ go run ./_examples/shell/help --help Usage: help An app demonstrating HelpProviders Flags: -h, --help Show context-sensitive help. --flag Regular flag help Commands: echo Regular command help ``` **Contextual** ```bash $ go run ./_examples/shell/help echo --help Usage: help echo Regular command help 🚀 additional command help Arguments: Regular argument help Flags: -h, --help Show context-sensitive help. --flag Regular flag help ``` #### Showing an _argument_'s detailed help Custom help will only be shown for _positional arguments with named fields_ ([see the README section on positional arguments for more details on what that means](#branching-positional-arguments)) **Contextual argument help** ```bash $ go run ./_examples/shell/help msg --help Usage: help echo Regular argument help 📣 additional argument help Flags: -h, --help Show context-sensitive help. --flag Regular flag help ``` ## Command handling There are two ways to handle commands in Kong. ### Switch on the command string When you call `kong.Parse()` it will return a unique string representation of the command. Each command branch in the hierarchy will be a bare word and each branching argument or required positional argument will be the name surrounded by angle brackets. Here's an example: There's an example of this pattern [here](https://github.com/alecthomas/kong/blob/master/_examples/shell/commandstring/main.go). eg. ```go package main import "github.com/alecthomas/kong" var CLI struct { Rm struct { Force bool `help:"Force removal."` Recursive bool `help:"Recursively remove files."` Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` } `cmd:"" help:"Remove files."` Ls struct { Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` } `cmd:"" help:"List paths."` } func main() { ctx := kong.Parse(&CLI) switch ctx.Command() { case "rm ": case "ls": default: panic(ctx.Command()) } } ``` This has the advantage that it is convenient, but the downside that if you modify your CLI structure, the strings may change. This can be fragile. ### Attach a `Run(...) error` method to each command A more robust approach is to break each command out into their own structs: 1. Break leaf commands out into separate structs. 2. Attach a `Run(...) error` method to all leaf commands. 3. Call `kong.Kong.Parse()` to obtain a `kong.Context`. 4. Call `kong.Context.Run(bindings...)` to call the selected parsed command. Once a command node is selected by Kong it will search from that node back to the root. Each encountered command node with a `Run(...) error` will be called in reverse order. This allows sub-trees to be reused fairly conveniently. In addition to values bound with the `kong.Bind(...)` option, any values passed through to `kong.Context.Run(...)` are also bindable to the target's `Run()` arguments. Finally, hooks can also contribute bindings via `kong.Context.Bind()` and `kong.Context.BindTo()`. There's a full example emulating part of the Docker CLI [here](https://github.com/alecthomas/kong/tree/master/_examples/docker). eg. ``` … ``` ## Hooks: BeforeReset(), BeforeResolve(), BeforeApply(), AfterApply(), AfterRun() If a node in the CLI, or any of its embedded fields, implements a `BeforeReset(...) error`, `BeforeResolve (...) error`, `BeforeApply(...) error`, `AfterApply(...) error`, and/or `AfterRun(...) error` method, those will be called as Kong resets, resolves, validates, and assigns values to the node. | Hook | Description | | --------------- | ----------------------------------------------------------------------------------------------------------- | | `BeforeReset` | Invoked before values are reset to their defaults (as defined by the grammar) or to zero values | | `BeforeResolve` | Invoked before resolvers are applied to a node | | `BeforeApply` | Invoked before the traced command line arguments are applied to the grammar | | `AfterApply` | Invoked after command line arguments are applied to the grammar **and validated** | | `AfterRun` | Invoked after `Run()` returns. Will not be called if `os.Exit()` is manually called. | The `--help` flag is implemented with a `BeforeReset` hook. eg. ```go // A flag with a hook that, if triggered, will set the debug loggers output to stdout. type debugFlag bool func (d debugFlag) BeforeApply(logger *log.Logger) error { logger.SetOutput(os.Stdout) return nil } var cli struct { Debug debugFlag `help:"Enable debug logging."` } func main() { // Debug logger going to discard. logger := log.New(io.Discard, "", log.LstdFlags) ctx := kong.Parse(&cli, kong.Bind(logger)) // ... } ``` It's also possible to register these hooks with the functional options `kong.WithBeforeReset`, `kong.WithBeforeResolve`, `kong.WithBeforeApply`, and `kong.WithAfterApply`. ## The Bind() option Arguments to hooks are provided via the `Run(...)` method or `Bind(...)` option. `*Kong`, `*Context`, `*Path` and parent commands are also bound and finally, hooks can also contribute bindings via `kong.Context.Bind()` and `kong.Context.BindTo()`. eg: ```go type CLI struct { Debug bool `help:"Enable debug mode."` Rm RmCmd `cmd:"" help:"Remove files."` Ls LsCmd `cmd:"" help:"List paths."` } type AuthorName string // ... func (l *LsCmd) Run(cli *CLI) error { // use cli.Debug here !! return nil } func (r *RmCmd) Run(author AuthorName) error{ // use binded author here return nil } func main() { var cli CLI ctx := kong.Parse(&cli, Bind(AuthorName("penguin"))) err := ctx.Run() ``` ## Flags Any [mapped](#mapper---customising-how-the-command-line-is-mapped-to-go-values) field in the command structure _not_ tagged with `cmd` or `arg` will be a flag. Flags are optional by default. eg. The command-line `app [--flag="foo"]` can be represented by the following. ```go type CLI struct { Flag string } ``` ## Commands and sub-commands Sub-commands are specified by tagging a struct field with `cmd`. Kong supports arbitrarily nested commands. eg. The following struct represents the CLI structure `command [--flag="str"] sub-command`. ```go type CLI struct { Command struct { Flag string SubCommand struct { } `cmd` } `cmd` } ``` If a sub-command is tagged with `default:"1"` it will be selected if there are no further arguments. If a sub-command is tagged with `default:"withargs"` it will be selected even if there are further arguments or flags and those arguments or flags are valid for the s

核心特点

  • •Version 1.0.0 Release
  • •Introduction
  • •Help as a user of a Kong application
  • •Defining help in Kong
  • •Command handling
  • •Switch on the command string
  • •Attach a Run(...) error method to each command
  • •Hooks: BeforeReset(), BeforeResolve(), BeforeApply(), AfterApply()
  • •The Bind() option
  • •Commands and sub-commands

> 标签

Gocommand-linecommandsflagsgo

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月10日
分类编程语言
定价开源

> 相关工具

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言
Baike.dev

baike.dev helps you discover great languages, frameworks, databases, DevOps and cloud-native tools.

Quick links

  • Home
  • All tools
  • Trending
  • Open source

About

  • About us
  • Community
  • News

Contribute

Found a great developer tool? Share it with the community.

Submit a tool
© 2026 baike.dev Developer EncyclopediaUpdated daily · Discover great developer tools