mirror of
https://github.com/spf13/cobra
synced 2024-09-28 19:06:26 +00:00
Compare commits
12 commits
eabe4e512a
...
4e07448e7a
Author | SHA1 | Date | |
---|---|---|---|
4e07448e7a | |||
5a1acea321 | |||
0fc86c2ffd | |||
6b5f577ebc | |||
bd914e58d6 | |||
1f80fa2e23 | |||
c69ae4c36b | |||
a30cee5e5a | |||
f34069ccf5 | |||
bd2655e76c | |||
bcfcff729e | |||
4fb0a66a34 |
7
.github/workflows/test.yml
vendored
7
.github/workflows/test.yml
vendored
|
@ -43,11 +43,11 @@ jobs:
|
||||||
|
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '^1.21'
|
go-version: '^1.22'
|
||||||
check-latest: true
|
check-latest: true
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- uses: golangci/golangci-lint-action@v3.7.0
|
- uses: golangci/golangci-lint-action@v4.0.0
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
args: --verbose
|
args: --verbose
|
||||||
|
@ -66,6 +66,7 @@ jobs:
|
||||||
- 19
|
- 19
|
||||||
- 20
|
- 20
|
||||||
- 21
|
- 21
|
||||||
|
- 22
|
||||||
name: '${{ matrix.platform }} | 1.${{ matrix.go }}.x'
|
name: '${{ matrix.platform }} | 1.${{ matrix.go }}.x'
|
||||||
runs-on: ${{ matrix.platform }}-latest
|
runs-on: ${{ matrix.platform }}-latest
|
||||||
steps:
|
steps:
|
||||||
|
@ -108,7 +109,7 @@ jobs:
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/go/pkg/mod
|
path: ~/go/pkg/mod
|
||||||
key: ${{ runner.os }}-${{ matrix.go }}-${{ hashFiles('**/go.sum') }}
|
key: ${{ runner.os }}-${{ matrix.go }}-${{ hashFiles('**/go.sum') }}
|
||||||
|
|
|
@ -29,7 +29,7 @@ linters:
|
||||||
- gas
|
- gas
|
||||||
#- gochecknoinits
|
#- gochecknoinits
|
||||||
- goconst
|
- goconst
|
||||||
#- gocritic
|
- gocritic
|
||||||
#- gocyclo
|
#- gocyclo
|
||||||
#- gofmt
|
#- gofmt
|
||||||
- goimports
|
- goimports
|
||||||
|
@ -37,7 +37,7 @@ linters:
|
||||||
#- gomnd
|
#- gomnd
|
||||||
#- goprintffuncname
|
#- goprintffuncname
|
||||||
#- gosec
|
#- gosec
|
||||||
#- gosimple
|
- gosimple
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- interfacer
|
- interfacer
|
||||||
|
|
|
@ -597,9 +597,7 @@ func writeRequiredFlag(buf io.StringWriter, cmd *Command) {
|
||||||
if nonCompletableFlag(flag) {
|
if nonCompletableFlag(flag) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for key := range flag.Annotations {
|
if _, ok := flag.Annotations[BashCompOneRequiredFlag]; ok {
|
||||||
switch key {
|
|
||||||
case BashCompOneRequiredFlag:
|
|
||||||
format := " must_have_one_flag+=(\"--%s"
|
format := " must_have_one_flag+=(\"--%s"
|
||||||
if flag.Value.Type() != "bool" {
|
if flag.Value.Type() != "bool" {
|
||||||
format += "="
|
format += "="
|
||||||
|
@ -611,7 +609,6 @@ func writeRequiredFlag(buf io.StringWriter, cmd *Command) {
|
||||||
WriteStringAndCheck(buf, fmt.Sprintf(" must_have_one_flag+=(\"-%s"+cbn, flag.Shorthand))
|
WriteStringAndCheck(buf, fmt.Sprintf(" must_have_one_flag+=(\"-%s"+cbn, flag.Shorthand))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,8 +154,10 @@ type Command struct {
|
||||||
// pflags contains persistent flags.
|
// pflags contains persistent flags.
|
||||||
pflags *flag.FlagSet
|
pflags *flag.FlagSet
|
||||||
// lflags contains local flags.
|
// lflags contains local flags.
|
||||||
|
// This field does not represent internal state, it's used as a cache to optimise LocalFlags function call
|
||||||
lflags *flag.FlagSet
|
lflags *flag.FlagSet
|
||||||
// iflags contains inherited flags.
|
// iflags contains inherited flags.
|
||||||
|
// This field does not represent internal state, it's used as a cache to optimise InheritedFlags function call
|
||||||
iflags *flag.FlagSet
|
iflags *flag.FlagSet
|
||||||
// parentsPflags is all persistent flags of cmd's parents.
|
// parentsPflags is all persistent flags of cmd's parents.
|
||||||
parentsPflags *flag.FlagSet
|
parentsPflags *flag.FlagSet
|
||||||
|
@ -1659,6 +1661,7 @@ func (c *Command) Flags() *flag.FlagSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
// LocalNonPersistentFlags are flags specific to this command which will NOT persist to subcommands.
|
// LocalNonPersistentFlags are flags specific to this command which will NOT persist to subcommands.
|
||||||
|
// This function does not modify the flags of the current command, it's purpose is to return the current state.
|
||||||
func (c *Command) LocalNonPersistentFlags() *flag.FlagSet {
|
func (c *Command) LocalNonPersistentFlags() *flag.FlagSet {
|
||||||
persistentFlags := c.PersistentFlags()
|
persistentFlags := c.PersistentFlags()
|
||||||
|
|
||||||
|
@ -1672,6 +1675,7 @@ func (c *Command) LocalNonPersistentFlags() *flag.FlagSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
// LocalFlags returns the local FlagSet specifically set in the current command.
|
// LocalFlags returns the local FlagSet specifically set in the current command.
|
||||||
|
// This function does not modify the flags of the current command, it's purpose is to return the current state.
|
||||||
func (c *Command) LocalFlags() *flag.FlagSet {
|
func (c *Command) LocalFlags() *flag.FlagSet {
|
||||||
c.mergePersistentFlags()
|
c.mergePersistentFlags()
|
||||||
|
|
||||||
|
@ -1699,6 +1703,7 @@ func (c *Command) LocalFlags() *flag.FlagSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
// InheritedFlags returns all flags which were inherited from parent commands.
|
// InheritedFlags returns all flags which were inherited from parent commands.
|
||||||
|
// This function does not modify the flags of the current command, it's purpose is to return the current state.
|
||||||
func (c *Command) InheritedFlags() *flag.FlagSet {
|
func (c *Command) InheritedFlags() *flag.FlagSet {
|
||||||
c.mergePersistentFlags()
|
c.mergePersistentFlags()
|
||||||
|
|
||||||
|
@ -1724,6 +1729,7 @@ func (c *Command) InheritedFlags() *flag.FlagSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NonInheritedFlags returns all flags which were not inherited from parent commands.
|
// NonInheritedFlags returns all flags which were not inherited from parent commands.
|
||||||
|
// This function does not modify the flags of the current command, it's purpose is to return the current state.
|
||||||
func (c *Command) NonInheritedFlags() *flag.FlagSet {
|
func (c *Command) NonInheritedFlags() *flag.FlagSet {
|
||||||
return c.LocalFlags()
|
return c.LocalFlags()
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -2092,12 +2092,12 @@ func TestCommandPrintRedirection(t *testing.T) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gotErrBytes, err := ioutil.ReadAll(errBuff)
|
gotErrBytes, err := io.ReadAll(errBuff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gotOutBytes, err := ioutil.ReadAll(outBuff)
|
gotOutBytes, err := io.ReadAll(outBuff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,7 @@ func fillHeader(header *GenManHeader, name string, disableAutoGen bool) error {
|
||||||
}
|
}
|
||||||
header.Date = &now
|
header.Date = &now
|
||||||
}
|
}
|
||||||
header.date = (*header.Date).Format("Jan 2006")
|
header.date = header.Date.Format("Jan 2006")
|
||||||
if header.Source == "" && !disableAutoGen {
|
if header.Source == "" && !disableAutoGen {
|
||||||
header.Source = "Auto generated by spf13/cobra"
|
header.Source = "Auto generated by spf13/cobra"
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,7 @@ func GenMarkdownTree(cmd *cobra.Command, dir string) error {
|
||||||
return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity)
|
return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenMarkdownTreeCustom is the the same as GenMarkdownTree, but
|
// GenMarkdownTreeCustom is the same as GenMarkdownTree, but
|
||||||
// with custom filePrepender and linkHandler.
|
// with custom filePrepender and linkHandler.
|
||||||
func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error {
|
func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error {
|
||||||
for _, c := range cmd.Commands() {
|
for _, c := range cmd.Commands() {
|
||||||
|
|
|
@ -140,7 +140,7 @@ func GenReSTTree(cmd *cobra.Command, dir string) error {
|
||||||
return GenReSTTreeCustom(cmd, dir, emptyStr, defaultLinkHandler)
|
return GenReSTTreeCustom(cmd, dir, emptyStr, defaultLinkHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenReSTTreeCustom is the the same as GenReSTTree, but
|
// GenReSTTreeCustom is the same as GenReSTTree, but
|
||||||
// with custom filePrepender and linkHandler.
|
// with custom filePrepender and linkHandler.
|
||||||
func GenReSTTreeCustom(cmd *cobra.Command, dir string, filePrepender func(string) string, linkHandler func(string, string) string) error {
|
func GenReSTTreeCustom(cmd *cobra.Command, dir string, filePrepender func(string) string, linkHandler func(string, string) string) error {
|
||||||
for _, c := range cmd.Commands() {
|
for _, c := range cmd.Commands() {
|
||||||
|
|
|
@ -40,7 +40,7 @@ func hasSeeAlso(cmd *cobra.Command) bool {
|
||||||
// that do not contain \n.
|
// that do not contain \n.
|
||||||
func forceMultiLine(s string) string {
|
func forceMultiLine(s string) string {
|
||||||
if len(s) > 60 && !strings.Contains(s, "\n") {
|
if len(s) > 60 && !strings.Contains(s, "\n") {
|
||||||
s = s + "\n"
|
s += "\n"
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,9 @@ function __%[1]s_perform_completion
|
||||||
__%[1]s_debug "Starting __%[1]s_perform_completion"
|
__%[1]s_debug "Starting __%[1]s_perform_completion"
|
||||||
|
|
||||||
# Extract all args except the last one
|
# Extract all args except the last one
|
||||||
set -l args (commandline -opc | string escape)
|
set -l args (
|
||||||
|
commandline -xpc 2>/dev/null ||
|
||||||
|
commandline -opc | string escape)
|
||||||
# Extract the last arg and escape it in case it is a space
|
# Extract the last arg and escape it in case it is a space
|
||||||
set -l lastArg (string escape -- (commandline -ct))
|
set -l lastArg (string escape -- (commandline -ct))
|
||||||
|
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -3,7 +3,7 @@ module github.com/spf13/cobra
|
||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3
|
github.com/cpuguy83/go-md2man/v2 v2.0.4
|
||||||
github.com/inconshreveable/mousetrap v1.1.0
|
github.com/inconshreveable/mousetrap v1.1.0
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -1,5 +1,5 @@
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
|
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
|
|
|
@ -28,8 +28,8 @@ import (
|
||||||
func genPowerShellComp(buf io.StringWriter, name string, includeDesc bool) {
|
func genPowerShellComp(buf io.StringWriter, name string, includeDesc bool) {
|
||||||
// Variables should not contain a '-' or ':' character
|
// Variables should not contain a '-' or ':' character
|
||||||
nameForVar := name
|
nameForVar := name
|
||||||
nameForVar = strings.Replace(nameForVar, "-", "_", -1)
|
nameForVar = strings.ReplaceAll(nameForVar, "-", "_")
|
||||||
nameForVar = strings.Replace(nameForVar, ":", "_", -1)
|
nameForVar = strings.ReplaceAll(nameForVar, ":", "_")
|
||||||
|
|
||||||
compCmd := ShellCompRequestCmd
|
compCmd := ShellCompRequestCmd
|
||||||
if !includeDesc {
|
if !includeDesc {
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
- [GoReleaser](https://goreleaser.com)
|
- [GoReleaser](https://goreleaser.com)
|
||||||
- [Helm](https://helm.sh)
|
- [Helm](https://helm.sh)
|
||||||
- [Hugo](https://gohugo.io)
|
- [Hugo](https://gohugo.io)
|
||||||
|
- [Incus](https://linuxcontainers.org/incus/)
|
||||||
- [Infracost](https://github.com/infracost/infracost)
|
- [Infracost](https://github.com/infracost/infracost)
|
||||||
- [Istio](https://istio.io)
|
- [Istio](https://istio.io)
|
||||||
- [Kool](https://github.com/kool-dev/kool)
|
- [Kool](https://github.com/kool-dev/kool)
|
||||||
|
@ -57,6 +58,7 @@
|
||||||
- [Scaleway CLI](https://github.com/scaleway/scaleway-cli)
|
- [Scaleway CLI](https://github.com/scaleway/scaleway-cli)
|
||||||
- [Sia](https://github.com/SiaFoundation/siad)
|
- [Sia](https://github.com/SiaFoundation/siad)
|
||||||
- [Skaffold](https://skaffold.dev/)
|
- [Skaffold](https://skaffold.dev/)
|
||||||
|
- [Taikun](https://taikun.cloud/)
|
||||||
- [Tendermint](https://github.com/tendermint/tendermint)
|
- [Tendermint](https://github.com/tendermint/tendermint)
|
||||||
- [Twitch CLI](https://github.com/twitchdev/twitch-cli)
|
- [Twitch CLI](https://github.com/twitchdev/twitch-cli)
|
||||||
- [UpCloud CLI (`upctl`)](https://github.com/UpCloudLtd/upcloud-cli)
|
- [UpCloud CLI (`upctl`)](https://github.com/UpCloudLtd/upcloud-cli)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
While you are welcome to provide your own organization, typically a Cobra-based
|
While you are welcome to provide your own organization, typically a Cobra-based
|
||||||
application will follow the following organizational structure:
|
application will follow the following organizational structure:
|
||||||
|
|
||||||
```
|
```test
|
||||||
▾ appName/
|
▾ appName/
|
||||||
▾ cmd/
|
▾ cmd/
|
||||||
add.go
|
add.go
|
||||||
|
@ -301,6 +301,7 @@ command := cobra.Command{
|
||||||
### Bind Flags with Config
|
### Bind Flags with Config
|
||||||
|
|
||||||
You can also bind your flags with [viper](https://github.com/spf13/viper):
|
You can also bind your flags with [viper](https://github.com/spf13/viper):
|
||||||
|
|
||||||
```go
|
```go
|
||||||
var author string
|
var author string
|
||||||
|
|
||||||
|
@ -320,12 +321,14 @@ More in [viper documentation](https://github.com/spf13/viper#working-with-flags)
|
||||||
|
|
||||||
Flags are optional by default. If instead you wish your command to report an error
|
Flags are optional by default. If instead you wish your command to report an error
|
||||||
when a flag has not been set, mark it as required:
|
when a flag has not been set, mark it as required:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
|
rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
|
||||||
rootCmd.MarkFlagRequired("region")
|
rootCmd.MarkFlagRequired("region")
|
||||||
```
|
```
|
||||||
|
|
||||||
Or, for persistent flags:
|
Or, for persistent flags:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
|
rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
|
||||||
rootCmd.MarkPersistentFlagRequired("region")
|
rootCmd.MarkPersistentFlagRequired("region")
|
||||||
|
@ -335,6 +338,7 @@ rootCmd.MarkPersistentFlagRequired("region")
|
||||||
|
|
||||||
If you have different flags that must be provided together (e.g. if they provide the `--username` flag they MUST provide the `--password` flag as well) then
|
If you have different flags that must be provided together (e.g. if they provide the `--username` flag they MUST provide the `--password` flag as well) then
|
||||||
Cobra can enforce that requirement:
|
Cobra can enforce that requirement:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
|
rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
|
||||||
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
|
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
|
||||||
|
@ -343,6 +347,7 @@ rootCmd.MarkFlagsRequiredTogether("username", "password")
|
||||||
|
|
||||||
You can also prevent different flags from being provided together if they represent mutually
|
You can also prevent different flags from being provided together if they represent mutually
|
||||||
exclusive options such as specifying an output format as either `--json` or `--yaml` but never both:
|
exclusive options such as specifying an output format as either `--json` or `--yaml` but never both:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
|
rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
|
||||||
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
|
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
|
||||||
|
@ -351,6 +356,7 @@ rootCmd.MarkFlagsMutuallyExclusive("json", "yaml")
|
||||||
|
|
||||||
If you want to require at least one flag from a group to be present, you can use `MarkFlagsOneRequired`.
|
If you want to require at least one flag from a group to be present, you can use `MarkFlagsOneRequired`.
|
||||||
This can be combined with `MarkFlagsMutuallyExclusive` to enforce exactly one flag from a given group:
|
This can be combined with `MarkFlagsMutuallyExclusive` to enforce exactly one flag from a given group:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
|
rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
|
||||||
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
|
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
|
||||||
|
@ -428,7 +434,7 @@ by not providing a 'Run' for the 'rootCmd'.
|
||||||
|
|
||||||
We have only defined one flag for a single command.
|
We have only defined one flag for a single command.
|
||||||
|
|
||||||
More documentation about flags is available at https://github.com/spf13/pflag
|
More documentation about flags is available at https://github.com/spf13/pflag.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
@ -722,7 +728,7 @@ command.SuggestionsMinimumDistance = 1
|
||||||
You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but make sense in your set of commands but for which
|
You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but make sense in your set of commands but for which
|
||||||
you don't want aliases. Example:
|
you don't want aliases. Example:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
$ kubectl remove
|
$ kubectl remove
|
||||||
Error: unknown command "remove" for "kubectl"
|
Error: unknown command "remove" for "kubectl"
|
||||||
|
|
||||||
|
@ -787,7 +793,7 @@ func main() {
|
||||||
|
|
||||||
Example run as a kubectl plugin:
|
Example run as a kubectl plugin:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
$ kubectl myplugin
|
$ kubectl myplugin
|
||||||
Usage:
|
Usage:
|
||||||
kubectl myplugin [command]
|
kubectl myplugin [command]
|
||||||
|
|
Loading…
Reference in a new issue