🌐 RunWithContext
在指定 context.Context 中执行 Composer 命令,提供对超时与取消的最大控制权。
何时使用
当你需要手动取消一个长时间运行的命令、或把命令纳入更大的上下文调度时使用。它是 Run 系列中控制力最强的方法,RunWithTimeout 内部也基于它实现。
签名
go
func (c *Composer) RunWithContext(ctx context.Context, args ...string) (string, error)参数
| 参数 | 类型 | 说明 |
|---|---|---|
ctx | context.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 数据。