Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-06 09:42:04828parcourir

从 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)

Puis dans la sous-commande

ctx := rootCmd.Context()

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
    },
}

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()

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer