Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Konteks yang diperoleh daripada subperintah cobra adalah kosong

Konteks yang diperoleh daripada subperintah cobra adalah kosong

WBOY
WBOYke hadapan
2024-02-06 09:42:04828semak imbas

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

Kandungan soalan

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

Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam