首頁 > 後端開發 > Golang > 主體

從 cobra 子指令檢索的上下文為空

WBOY
發布: 2024-02-06 09:42:04
轉載
826 人瀏覽過

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

問題內容

我想要一個全域逾時(在rootCmd 中設定),因此我在rootCmd 中設定如下

ctxInit := context.Background()
timeout := viper.GetInt("timeout")
ctx, cancel := context.WithTimeout(ctxInit, time.Duration(timeout)*time.Second)
defer cancel()
cmd.SetContext(ctx)
登入後複製

然後在子命令中

ctx := rootCmd.Context()
登入後複製

但是 ctxcontext.emptyCtx {}

#我在設定/檢索上下文方面做錯了什麼嗎?

編輯

我的 rootCmd 宣告

// 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
    },
}
登入後複製


正確答案


如@Peter所提到的,cmd和rootCmd不一樣。 Cobra文件描述了PersistentPreRun(E)

所以 cmd.SetContext(ctx) 沒有設定 rootCmd 的上下文,而是設定子指令的上下文。

然後在子命令中,您可以使用:

ctx := cmd.Context()
登入後複製

而不是 rootCmd.Context()

以上是從 cobra 子指令檢索的上下文為空的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!