pflag es un reemplazo directo del paquete de banderas de Go, que implementa --flags estilo POSIX/GNU.
pflag es compatible con las extensiones GNU de las recomendaciones POSIX para opciones de línea de comandos. Para obtener una descripción más precisa, consulte la sección "Sintaxis de indicadores de línea de comandos" a continuación.
pflag está disponible bajo el mismo estilo de licencia BSD que el lenguaje Go, que se puede encontrar en el archivo LICENCIA.
pflag está disponible mediante el comando estándar go get
.
Instalar ejecutando:
go get github.com/spf13/pflag
Ejecute pruebas ejecutando:
go test github.com/spf13/pflag
pflag es un reemplazo directo del paquete de banderas nativas de Go. Si importa pflag con el nombre "flag", entonces todo el código debería seguir funcionando sin cambios.
import flag "github.com/spf13/pflag"
Hay una excepción a esto: si crea una instancia directa de la estructura Flag, habrá un campo más "Atajo" que deberá configurar. La mayoría del código nunca crea una instancia de esta estructura directamente y, en su lugar, utiliza funciones como String(), BoolVar() y Var() y, por lo tanto, no se ve afectado.
Defina banderas usando flag.String(), Bool(), Int(), etc.
Esto declara un indicador de número entero, -flagname, almacenado en el puntero ip, con tipo *int.
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
Si lo desea, puede vincular la bandera a una variable usando las funciones Var().
var flagvar int
func init () {
flag . IntVar ( & flagvar , "flagname" , 1234 , "help message for flagname" )
}
O puede crear indicadores personalizados que satisfagan la interfaz Valor (con receptores de puntero) y acoplarlos para analizar el indicador mediante
flag . Var ( & flagVal , "name" , "help message for flagname" )
Para tales indicadores, el valor predeterminado es solo el valor inicial de la variable.
Después de definir todas las banderas, llame
flag . Parse ()
para analizar la línea de comando en los indicadores definidos.
Entonces se pueden utilizar banderas directamente. Si estás usando las banderas mismas, todas son punteros; si te unes a variables, son valores.
fmt . Println ( "ip has value " , * ip )
fmt . Println ( "flagvar has value " , flagvar )
Hay funciones de ayuda disponibles para obtener el valor almacenado en un Flag si tiene un FlagSet pero le resulta difícil mantenerse al día con todos los punteros en su código. Si tiene un pflag.FlagSet con una bandera llamada 'flagname' de tipo int, puede usar GetInt() para obtener el valor int. Pero observe que 'flagname' debe existir y debe ser un int. GetString("flagname") fallará.
i , err := flagset . GetInt ( "flagname" )
Después del análisis, los argumentos después de la bandera están disponibles como el segmento flag.Args() o individualmente como flag.Arg(i). Los argumentos están indexados desde 0 hasta flag.NArg()-1.
El paquete pflag también define algunas funciones nuevas que no están en flag, que proporcionan abreviaturas de una letra para las banderas. Puede usarlos agregando 'P' al nombre de cualquier función que defina una bandera.
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
var flagvar bool
func init () {
flag . BoolVarP ( & flagvar , "boolname" , "b" , true , "help message" )
}
flag . VarP ( & flagVal , "varname" , "v" , "help message" )
Las letras taquigráficas se pueden utilizar con guiones simples en la línea de comando. Las banderas taquigráficas booleanas se pueden combinar con otras banderas taquigráficas.
El conjunto predeterminado de indicadores de línea de comandos está controlado por funciones de nivel superior. El tipo FlagSet permite definir conjuntos independientes de indicadores, como implementar subcomandos en una interfaz de línea de comandos. Los métodos de FlagSet son análogos a las funciones de nivel superior para el conjunto de banderas de línea de comandos.
Después de crear una bandera, es posible configurar pflag.NoOptDefVal para la bandera dada. Hacer esto cambia ligeramente el significado de la bandera. Si un indicador tiene un NoOptDefVal y el indicador se establece en la línea de comando sin una opción, el indicador se establecerá en NoOptDefVal. Por ejemplo dado:
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
flag . Lookup ( "flagname" ). NoOptDefVal = "4321"
Resultaría en algo como
Argumentos analizados | Valor resultante |
---|---|
--nombre de bandera = 1357 | ip=1357 |
--nombre de bandera | ip=4321 |
[nada] | ip=1234 |
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x
A diferencia del paquete de banderas, un solo guión antes de una opción significa algo diferente a un guión doble. Los guiones simples indican una serie de letras abreviadas para banderas. Todas, excepto la última letra taquigráfica, deben ser indicadores booleanos o un indicador con un valor predeterminado.
// boolean or flags where the 'no option default value' is set
-f
-f=true
-abc
but
-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
El análisis de la bandera se detiene después del terminador "--". A diferencia del paquete de banderas, las banderas se pueden intercalar con argumentos en cualquier lugar de la línea de comando antes de este terminador.
Los indicadores de números enteros aceptan 1234, 0664, 0x1234 y pueden ser negativos. Las banderas booleanas (en su forma larga) aceptan 1, 0, t, f, verdadero, falso, VERDADERO, FALSO, Verdadero, Falso. Los indicadores de duración aceptan cualquier entrada válida para time.ParseDuration.
Es posible establecer un nombre de indicador personalizado 'función de normalización'. Permite mutar los nombres de las banderas tanto cuando se crean en el código como cuando se usan en la línea de comando a alguna forma "normalizada". La forma "normalizada" se utiliza para comparar. A continuación se muestran dos ejemplos del uso de la función de normalización personalizada.
Ejemplo #1 : Quieres -, _ y . en banderas para comparar las mismas. también conocido como --my-flag == --my_flag == --my.flag
func wordSepNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
from := [] string { "-" , "_" }
to := "."
for _ , sep := range from {
name = strings . Replace ( name , sep , to , - 1 )
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( wordSepNormalizeFunc )
Ejemplo n.º 2 : desea asignar un alias a dos banderas. también conocido como --old-flag-name == --new-flag-name
func aliasNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
switch name {
case "old-flag-name" :
name = "new-flag-name"
break
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( aliasNormalizeFunc )
Es posible desaprobar una bandera, o simplemente su abreviatura. Desaprobar un indicador/taquigrafía lo oculta del texto de ayuda e imprime un mensaje de uso cuando se utiliza el indicador/taquigrafía obsoleto.
Ejemplo #1 : Desea desaprobar una bandera llamada "badflag", así como informar a los usuarios qué bandera deberían usar en su lugar.
// deprecate a flag by specifying its name and a usage message
flags . MarkDeprecated ( "badflag" , "please use --good-flag instead" )
Esto oculta "badflag" del texto de ayuda e imprime Flag --badflag has been deprecated, please use --good-flag instead
cuando se utilice "badflag".
Ejemplo n.º 2 : desea mantener el nombre de un indicador "noshorthandflag" pero desaprobar su nombre corto "n".
// deprecate a flag shorthand by specifying its flag name and a usage message
flags . MarkShorthandDeprecated ( "noshorthandflag" , "please use --noshorthandflag only" )
Esto oculta el nombre abreviado "n" del texto de ayuda e imprime Flag shorthand -n has been deprecated, please use --noshorthandflag only
cuando se utilice la abreviatura "n".
Tenga en cuenta que el mensaje de uso es esencial aquí y no debe estar vacío.
Es posible marcar una bandera como oculta, lo que significa que seguirá funcionando normalmente, sin embargo, no aparecerá en el texto de uso/ayuda.
Ejemplo : tiene una bandera llamada "secretFlag" que necesita solo para uso interno y no desea que aparezca en el texto de ayuda ni que su texto de uso esté disponible.
// hide a flag by specifying its name
flags . MarkHidden ( "secretFlag" )
pflag
le permite deshabilitar la clasificación de indicadores para mensajes de ayuda y uso.
Ejemplo :
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 = false
flags . PrintDefaults ()
Producción :
-v, --verbose verbose output
--coolflag string it's really cool flag (default "yeaah")
--usefulflag int sometimes it's very useful (default 777)
Para admitir banderas definidas usando el paquete flag
de Go, se deben agregar al conjunto de banderas pflag
. Esto suele ser necesario para admitir indicadores definidos por dependencias de terceros (por ejemplo, golang/glog
).
Ejemplo : desea agregar las banderas Go al conjunto de banderas CommandLine
import (
goflag "flag"
flag "github.com/spf13/pflag"
)
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
func main () {
flag . CommandLine . AddGoFlagSet ( goflag . CommandLine )
flag . Parse ()
}
Puede ver la documentación de referencia completa del paquete pflag en godoc.org, o a través del sistema de documentación estándar de go ejecutando godoc -http=:6060
y navegando a http://localhost:6060/pkg/github.com/spf13/pflag después de la instalación.