Rumah >pembangunan bahagian belakang >Golang >Konteks yang diperoleh daripada subperintah cobra adalah kosong
Saya mahu tamat masa global (set dalam rootCmd
中设置),因此我在 rootCmd
seperti berikut
ctxInit := context.Background() timeout := viper.GetInt("timeout") ctx, cancel := context.WithTimeout(ctxInit, time.Duration(timeout)*time.Second) defer cancel() cmd.SetContext(ctx)
Kemudian dalam subperintah
ctx := rootCmd.Context()
Tetapi ctx
是 context.emptyCtx {}
Adakah saya melakukan sesuatu yang salah dalam menetapkan/mendapatkan semula konteks?
Sunting
Saya rootCmd
Kenyataan
// 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 }, }
Seperti yang @Peter sebutkan, cmd dan rootCmd tidak sama. Dokumentasi Cobra menerangkan PersistentPreRun(E)
:
Jadi cmd.SetContext(ctx)
konteks rootCmd tidak ditetapkan, tetapi konteks subperintah ditetapkan.
Kemudian dalam subperintah anda boleh menggunakan:
ctx := cmd.Context()
bukannya rootCmd.Context()
.
Atas ialah kandungan terperinci Konteks yang diperoleh daripada subperintah cobra adalah kosong. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!