- Notifications
You must be signed in to change notification settings - Fork0
Drop-in replacement for Go's flag package, implementing POSIX/GNU-style --flags.
License
lmvgo/pflag
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
TODO:
- Wait forspf13#386
- Add Enum support: a flag can be of a set of values only
pflag is a drop-in replacement for Go's flag package, implementingPOSIX/GNU-style --flags.
pflag is compatible with theGNU extensions to the POSIX recommendationsfor command-line options. For a more precise description, see the"Command-line flag syntax" section below.
pflag is available under the same style of BSD license as the Go language,which can be found in the LICENSE file.
pflag is available using the standardgo get
command.
Install by running:
go get github.com/spf13/pflag
Run tests by running:
go test github.com/spf13/pflag
pflag is a drop-in replacement of Go's native flag package. If you importpflag under the name "flag" then all code should continue to functionwith no changes.
import flag"github.com/spf13/pflag"
There is one exception to this: if you directly instantiate the Flag structthere is one more field "Shorthand" that you will need to set.Most code never instantiates this struct directly, and instead usesfunctions such as String(), BoolVar(), and Var(), and is thereforeunaffected.
Define flags using flag.String(), Bool(), Int(), etc.
This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
varip*int=flag.Int("flagname",1234,"help message for flagname")
If you like, you can bind the flag to a variable using the Var() functions.
varflagvarintfuncinit() {flag.IntVar(&flagvar,"flagname",1234,"help message for flagname")}
Or you can create custom flags that satisfy the Value interface (withpointer receivers) and couple them to flag parsing by
flag.Var(&flagVal,"name","help message for flagname")
For such flags, the default value is just the initial value of the variable.
After all flags are defined, call
flag.Parse()
to parse the command line into the defined flags.
Flags may then be used directly. If you're using the flags themselves,they are all pointers; if you bind to variables, they're values.
fmt.Println("ip has value ",*ip)fmt.Println("flagvar has value ",flagvar)
There are helper functions available to get the value stored in a Flag if you have a FlagSet but findit difficult to keep up with all of the pointers in your code.If you have a pflag.FlagSet with a flag called 'flagname' of type int youcan use GetInt() to get the int value. But notice that 'flagname' must existand it must be an int. GetString("flagname") will fail.
i,err:=flagset.GetInt("flagname")
After parsing, the arguments after the flag are available as theslice flag.Args() or individually as flag.Arg(i).The arguments are indexed from 0 through flag.NArg()-1.
The pflag package also defines some new functions that are not in flag,that give one-letter shorthands for flags. You can use these by appending'P' to the name of any function that defines a flag.
varip=flag.IntP("flagname","f",1234,"help message")varflagvarboolfuncinit() {flag.BoolVarP(&flagvar,"boolname","b",true,"help message")}flag.VarP(&flagVal,"varname","v","help message")
Shorthand letters can be used with single dashes on the command line.Boolean shorthand flags can be combined with other shorthand flags.
The default set of command-line flags is controlled bytop-level functions. The FlagSet type allows one to defineindependent sets of flags, such as to implement subcommandsin a command-line interface. The methods of FlagSet areanalogous to the top-level functions for the command-lineflag set.
After you create a flag it is possible to set the pflag.NoOptDefVal forthe given flag. Doing this changes the meaning of the flag slightly. Ifa flag has a NoOptDefVal and the flag is set on the command line withoutan option the flag will be set to the NoOptDefVal. For example given:
varip=flag.IntP("flagname","f",1234,"help message")flag.Lookup("flagname").NoOptDefVal="4321"
Would result in something like
Parsed Arguments | Resulting Value |
---|---|
--flagname=1357 | ip=1357 |
--flagname | ip=4321 |
[nothing] | ip=1234 |
--flag // boolean flags, or flags with no option default values--flag x // only on flags without a default value--flag=x
Unlike the flag package, a single dash before an option means somethingdifferent than a double dash. Single dashes signify a series of shorthandletters for flags. All but the last shorthand letter must be boolean flagsor a flag with a default value
// boolean or flags where the 'no option default value' is set-f-f=true-abcbut-b true is INVALID// non-boolean and flags without a 'no option default value'-n 1234-n=1234-n1234// mixed-abcs "hello"-absd="hello"-abcs1234
Flag parsing stops after the terminator "--". Unlike the flag package,flags can be interspersed with arguments anywhere on the command linebefore this terminator.
Integer flags accept 1234, 0664, 0x1234 and may be negative.Boolean flags (in their long form) accept 1, 0, t, f, true, false,TRUE, FALSE, True, False.Duration flags accept any input valid for time.ParseDuration.
It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow.
Example #1: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag
funcwordSepNormalizeFunc(f*pflag.FlagSet,namestring) pflag.NormalizedName {from:= []string{"-","_"}to:="."for_,sep:=rangefrom {name=strings.Replace(name,sep,to,-1)}returnpflag.NormalizedName(name)}myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc)
Example #2: You want to alias two flags. aka --old-flag-name == --new-flag-name
funcaliasNormalizeFunc(f*pflag.FlagSet,namestring) pflag.NormalizedName {switchname {case"old-flag-name":name="new-flag-name"break}returnpflag.NormalizedName(name)}myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)
It is possible to deprecate a flag, or just its shorthand. Deprecating a flag/shorthand hides it from help text and prints a usage message when the deprecated flag/shorthand is used.
Example #1: You want to deprecate a flag named "badflag" as well as inform the users what flag they should use instead.
// deprecate a flag by specifying its name and a usage messageflags.MarkDeprecated("badflag","please use --good-flag instead")
This hides "badflag" from help text, and printsFlag --badflag has been deprecated, please use --good-flag instead
when "badflag" is used.
Example #2: You want to keep a flag name "noshorthandflag" but deprecate its shortname "n".
// deprecate a flag shorthand by specifying its flag name and a usage messageflags.MarkShorthandDeprecated("noshorthandflag","please use --noshorthandflag only")
This hides the shortname "n" from help text, and printsFlag shorthand -n has been deprecated, please use --noshorthandflag only
when the shorthand "n" is used.
Note that usage message is essential here, and it should not be empty.
It is possible to mark a flag as hidden, meaning it will still function as normal, however will not show up in usage/help text.
Example: You have a flag named "secretFlag" that you need for internal use only and don't want it showing up in help text, or for its usage text to be available.
// hide a flag by specifying its nameflags.MarkHidden("secretFlag")
pflag
allows you to disable sorting of flags for help and usage message.
Example:
flags.BoolP("verbose","v",false,"verbose output")flags.String("coolflag","yeaah","it's really cool flag")flags.Int("usefulflag",777,"sometimes it's very useful")flags.SortFlags=falseflags.PrintDefaults()
Output:
-v, --verbose verbose output --coolflag string it's really cool flag (default "yeaah") --usefulflag int sometimes it's very useful (default 777)
In order to support flags defined using Go'sflag
package, they must be added to thepflag
flagset. This is usually necessaryto support flags defined by third-party dependencies (e.g.golang/glog
).
Example: You want to add the Go flags to theCommandLine
flagset
import (goflag"flag"flag"github.com/spf13/pflag")varip*int=flag.Int("flagname",1234,"help message for flagname")funcmain() {flag.CommandLine.AddGoFlagSet(goflag.CommandLine)flag.Parse()}
You can see the full reference documentation of the pflag packageat godoc.org, or through go's standard documentation system byrunninggodoc -http=:6060
and browsing tohttp://localhost:6060/pkg/github.com/spf13/pflag afterinstallation.
About
Drop-in replacement for Go's flag package, implementing POSIX/GNU-style --flags.
Resources
License
Stars
Watchers
Forks
Packages0
Languages
- Go99.4%
- Shell0.6%