You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go中通过Pulumi Automation API将标准输出格式化为JSON?

将Pulumi Automation API的输出格式化为JSON(Go语言)

要实现将Pulumi Automation API的输出格式化为JSON,最可靠且简单的方式是直接接收结构化的ProgressEvent并序列化为JSON,而非处理格式化后的文本输出。以下是具体实现示例:

实现步骤

  1. 用optup.EventStreams替代ProgressStreams,接收原始的pulumi.ProgressEvent事件流
  2. 启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:05:10