如何在Go中通过Pulumi Automation API将标准输出格式化为JSON?
将Pulumi Automation API的输出格式化为JSON(Go语言)
要实现将Pulumi Automation API的输出格式化为JSON,最可靠且简单的方式是直接接收结构化的ProgressEvent并序列化为JSON,而非处理格式化后的文本输出。以下是具体实现示例:
实现步骤
- 用
optup.EventStreams替代ProgressStreams,接收原始的pulumi.ProgressEvent事件流 - 启动goroutine将每个事件序列化为JSON并输出到标准输出
package main import ( "context" "encoding/json" "log" "os" "github.com/pulumi/pulumi/sdk/v3/go/auto" "github.com/pulumi/pulumi/sdk/v3/go/auto/optup" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) func main() { // 初始化或获取目标栈(根据你的项目路径调整) stack, err := auto.UpsertStackLocalSource(context.Background(), "dev", "./your-project-dir") if err != nil { log.Fatalf("Failed to initialize stack: %v", err) } // 创建事件通道用于接收ProgressEvent eventChan := make(chan pulumi.ProgressEvent) defer close(eventChan) // 启动goroutine处理事件,将每个事件序列化为JSON输出 go func() { jsonEncoder := json.NewEncoder(os.Stdout) for event := range eventChan { if err := jsonEncoder.Encode(event); err != nil { log.Printf("Failed to encode event to JSON: %v", err) } } }() // 执行栈更新,传递事件通道 _, err = stack.Up(context.Background(), optup.EventStreams(eventChan)) if err != nil { log.Fatalf("Failed to update stack: %v", err) } }
说明
pulumi.ProgressEvent包含更新过程中的所有结构化信息,包括事件类型、资源状态、日志消息等,直接序列化可保留完整上下文数据- 使用
json.NewEncoder输出的每一行都是独立的JSON对象,便于后续日志解析或处理 - 这种方式避免了解析文本输出的复杂性,比处理格式化后的stdout更可靠
内容的提问来源于stack exchange,提问作者PopSmoke
相关产品推荐
相关产品推荐

