Konteks yang diperoleh daripada subperintah cobra adalah kosong

WBOY
Lepaskan: 2024-02-06 09:42:04
ke hadapan
826 orang telah melayarinya

从 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)
Salin selepas log masuk

Kemudian dalam subperintah

ctx := rootCmd.Context()
Salin selepas log masuk

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
    },
}
Salin selepas log masuk


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()
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!