Maison > développement back-end > Golang > Le contexte récupéré de la sous-commande cobra est vide

Le contexte récupéré de la sous-commande cobra est vide

WBOY
Libérer: 2024-02-06 09:42:04
avant
891 Les gens l'ont consulté

从 cobra 子命令检索的上下文为空

Contenu de la question

Je souhaite un délai d'attente global (défini dans rootCmd 中设置),因此我在 rootCmd comme suit

ctxInit := context.Background()
timeout := viper.GetInt("timeout")
ctx, cancel := context.WithTimeout(ctxInit, time.Duration(timeout)*time.Second)
defer cancel()
cmd.SetContext(ctx)
Copier après la connexion

Puis dans la sous-commande

ctx := rootCmd.Context()
Copier après la connexion

Mais ctxcontext.emptyCtx {}

Est-ce que je fais quelque chose de mal lors de la définition/récupération du contexte ?

Modifier

Ma rootCmd Déclaration

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
    Use:              "my-cli",
    TraverseChildren: true,
    Short:            "cli",
    PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
        var err error
        logger, err = logging.InitialiseLogger(*logLevel, *logFormat)
        if err != nil {
            return err
        }
        if err := viper.BindPFlags(cmd.Flags()); err != nil {
            return fmt.Errorf("error binding flags to %s command: %w\n", cmd.Name(), err)
        }
        if err := cloneMethodValidator(cmd); err != nil {
            return err
        }
        if err := InitConfig(false); err != nil {
            logger.Fatal("ERROR initiating configuration:\n", err)
        }
        ctxInit := context.Background()
        timeout := viper.GetInt("timeout")
        ctx, cancel := context.WithTimeout(ctxInit, time.Duration(timeout)*time.Second)
        defer cancel()
        cmd.SetContext(ctx)
        return nil
    },
}
Copier après la connexion


Bonne réponse


Comme @Peter l'a mentionné, cmd et rootCmd ne sont pas les mêmes. La documentation Cobra décrit PersistentPreRun(E) :

Donc cmd.SetContext(ctx) le contexte de rootCmd n'est pas défini, mais le contexte de la sous-commande est défini.

Ensuite dans la sous-commande vous pouvez utiliser :

ctx := cmd.Context()
Copier après la connexion

au lieu de rootCmd.Context().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal