我想要一个全局超时(在
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()
但是
ctx
是context.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()
。