Heim >Backend-Entwicklung >Golang >Der vom Unterbefehl „cobra' abgerufene Kontext ist leer
Ich möchte ein globales Timeout (einstellen rootCmd
中设置),因此我在 rootCmd
wie folgt
ctxInit := context.Background() timeout := viper.GetInt("timeout") ctx, cancel := context.WithTimeout(ctxInit, time.Duration(timeout)*time.Second) defer cancel() cmd.SetContext(ctx)
Dann im Unterbefehl
ctx := rootCmd.Context()
Aber ctx
是 context.emptyCtx {}
Mache ich beim Festlegen/Abrufen des Kontexts etwas falsch?
Bearbeiten
Mein rootCmd
Statement
// 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 }, }
Wie @Peter erwähnt hat, sind cmd und rootCmd nicht dasselbe. Die Cobra-Dokumentation beschreibt PersistentPreRun(E)
:
Also cmd.SetContext(ctx)
wird der Kontext von rootCmd nicht festgelegt, aber der Kontext des Unterbefehls wird festgelegt.
Dann können Sie im Unterbefehl Folgendes verwenden:
ctx := cmd.Context()
statt rootCmd.Context()
.
Das obige ist der detaillierte Inhalt vonDer vom Unterbefehl „cobra' abgerufene Kontext ist leer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!