Skip to content

🌐 RunWithContext

在指定 context.Context 中执行 Composer 命令,提供对超时与取消的最大控制权。

何时使用

当你需要手动取消一个长时间运行的命令、或把命令纳入更大的上下文调度时使用。它是 Run 系列中控制力最强的方法,RunWithTimeout 内部也基于它实现。

签名

go
func (c *Composer) RunWithContext(ctx context.Context, args ...string) (string, error)

参数

参数类型说明
ctxcontext.Context上下文,可用于超时或取消
args...string命令参数,第一个参数是 Composer 子命令

返回值

返回值类型说明
第一返回值string命令的标准输出(含合并的 stderr)
第二返回值error命令执行失败或上下文取消时返回,可用 errors.Is(err, context.Canceled) 判断取消

示例

go
package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"time"

	"github.com/scagogogo/composer-skills/pkg/composer"
)

func main() {
	comp, err := composer.New(composer.DefaultOptions())
	if err != nil {
		log.Fatalf("初始化失败: %v", err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	output, err := comp.RunWithContext(ctx, "update")
	if err != nil {
		if errors.Is(err, context.DeadlineExceeded) {
			log.Fatalf("更新超时")
		}
		log.Fatalf("执行失败: %v", err)
	}
	fmt.Println(output)
}

进阶

  • 只需超时控制使用更简洁的 RunWithTimeout
  • 不需要上下文使用 Run
  • 该方法会被测试 mock 机制拦截:设置了 mock 输出时直接返回 mock 数据。

基于 MIT 许可证发布