将变量注入 JSON 配置文件



我们有一个 AWS Lambda 函数,它可以动态构建测试环境,供我们的工程师通过 GitHub 拉取请求测试他们的代码。

这个 Lambda 函数是使用 GitHub webhook 调用的,Github POST 包含为该特定产品配置测试环境所需的所有信息。

目前,AWS Lambda 函数采用硬编码,用于解析 POST 数据并构建测试环境。但是,随着被测产品范围的增加和测试环境的范围变得更加多样化,我们希望摆脱硬编码方法;为了可管理性。

我希望能够做的是加载一个配置文件,最好是 JSON 格式,并将 GitHub POST 数据中的一些数据应用到配置文件中,本质上是将数据注入到 JSON 配置中。

我不知道如何处理这个问题。我在这里看到有人问了一个问题,想要做类似的事情,但在 Java 中: 将动态生成的数据注入 JSON

最初我们的 Lambda 函数是用 Node.js 编写的,但我们已经开始转向 Go——主要是因为它是一个有趣的新挑战。如果在 Node 中有一个解决方案.js我会接受它,但如果在 Go 中有一个解决方案,那将是可取的。

编辑:

配置文件和 GitHub POST 数据具有两种不同的结构。

GitHub POST 数据 (大量精简):

{
"action": "opened",
"number": 89,
"pull_request": {
"url": "https://api.github.com/repos/Owner/ExampleRepository/pulls/89",
"head": {
"repo": {
"id": 123454678,
"name": "ExampleRepository"
}
}
}
}

示例配置文件(也已剥离):

{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": [GitHub Post data].pull_request.url,
"Resources": {
"ElasticBeanstalk": {
"Type": "AWS::ElasticBeanstalk::Environment",
"Properties": {
"ApplicationName": [GitHub Post data].pull_request.head.repo + [GitHub Post data].number,
"Description": [GitHub Post data].pull_request.url
}
}
}
}

配置文件和 GitHub POST 数据都比这复杂得多。此外,配置文件将多次引用 POST 数据的各个部分,有时需要连接多个值。

尝试对 JSON 文本进行文本操作可能容易出错(考虑转义和 unicode 序列,例如这是有效的 JSON:{"a":""b"})。将 JSON 配置解编为 Go 值,对其执行修改,然后封送到 JSON 要容易得多,也更安全。

如果配置结构已知,请创建匹配的 Go 结构以对其进行精确建模。

如果配置结构未知,或者您不想麻烦它,则可以解编组为类型interface{}的值,并对其执行修改。这将更加冗长,因为您必须为每个属性和索引执行类型断言。

为了减轻后者的痛苦,您可以使用第三方库,例如github.com/icza/dyno(披露:我是作者)。

要"合并"来自 POST 请求的现有配置和数据,请查看此答案:"合并"字段两个相同类型的结构

为什么不使用标准包?os包具有ExpandEnv,以扩展${VARNAME}并使用环境变量值$VARNAME给定字符串中的样式子字符串。只需将值作为环境值传递,读取文件并执行以下操作:

replacedVars := os.ExpandEnv(fContents)

查看os.ExpandEnv文档

基本上,我会写这样的东西:

package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
fname = "foobar.json" // wherever this comes from
buf, err := ioutil.ReadFile(fname)
if err != nil {
fmt.Printf("Failed to read file %s - %+v", fname, err)
return
}
conf := os.ExpandEnv(string(buf))
// do whatever you need to do with conf string...
}

我很感激所有的回答,每一个都帮助我进一步增加了对围棋的了解。

对我来说,解决此问题的最佳方法是使用文本/模板库并将 JSON 配置创建为文本模板,这让我可以轻松应用 GitHub post 请求中的变量。

https://golang.org/pkg/text/template/

最新更新