1

我有一些配置文件,我将复杂的对象值存储为序列化的 json。目前,每个环境(localhost、dev、prod 等)和客户端的每次安装都有一个配置文件。大多数值对于环境之间的配置是相同的,但不是全部。因此,对于三个环境和四个客户端,我目前总共需要管理 12 个文件。

如果这是一个 web.config 文件,就会有 web.config 转换来解决问题。如果这是 c#,我将有编译器预处理器指令,可用于根据当前构建配置替换不同的值。

有没有人知道任何基本上以这种方式工作的东西,或者对经过验证的真实方法有一些好的建议?我想要的是将文件数量减少到每个安装的单个实例,这足以满足每个环境。

4

5 回答 5

2

配置的配置对我来说似乎总是有点过头了,但是您可以使用属性文件来处理更改的部分,并使用 apache ant 的<replace>任务来进行替换。像这样的东西:

<replace 
    file="configure.json"
    propertyFile="config-of-config.properties">
  <replacefilter 
    token="@token1@" 
    property="property.key"/>
</replace>
于 2012-09-14T19:25:16.843 回答
2

来自 Google 的Jsonnet是一种具有基于 JSON 的超集语法的语言,添加了有助于在 JSON fromat 中建模数据的高级语言功能。编译步骤生成 JSON。我在一个项目中使用它来描述复杂的部署环境,这些环境有时会相互继承,并且共享域属性,尽管从一个实例到另一个实例使用它们的方式不同。例如,一个实例包含应用程序、这些应用程序的租户订阅、合同、目的地等。所有这些属性的值都是在整个环境中重复出现的对象。

他们的文档非常详尽,不会错过std 函数,因为它们提供了一些非常强大的数据渲染功能。

于 2017-04-09T12:49:22.197 回答
1

我编写了一个Squirrelistic JSON 预处理器,它使用Golang 文本模板语法根据提供的参数生成 JSON 文件。

JSON 模板可以包含对其他模板的引用、使用条件逻辑、注释、变量以及 Golang Text 模板包提供的所有其他内容。

于 2020-07-30T16:08:45.363 回答
0

这真的归结为你的全部堆栈。

如果您正在谈论一些仅在客户端运行而没有服务器端处理的应用程序,那么实际上没有预处理之类的东西。您可以在实际使用数据之前进一步处理数据,但这并不意味着它将在提供页面之前进行处理——这意味着人们必须坐在那里,等待在需要它的应用程序之前发生这种情况数据可以初始化。

首先使用 JSON 的好处是它只是一个数据存储,并且与语言完全无关,并且现在得到了广泛的支持。因此,如果它不是 100% 客户端,则没有什么可以阻止您以您在服务器上使用的任何语言进行预处理,并缓存这些文件的这些版本,以根据用户的需要服务(和缓存)给用户.

如果您真的非常需要一个系统来在客户端对配置文件进行实时处理,并且您已经完成了创建应用程序视图的工作,这些视图会提前加载,但会向用户显示他们正在推迟初始化(即:“正在加载...”/spinners),然后下载第二个 JSON 文件,其中包含所有需要的特定于实现的数据(您将拥有 12 个这样的小文件,应该易于管理),将两个 JSON 文件解析为 JS 对象,并使用辅助文件中的附加数据扩展大型配置对象。

请注意:使用 localhost 或其他一些存储设施来缓存它,这样对于 html5 浏览器,这种较长的加载只会发生一次。

于 2012-09-14T19:38:48.300 回答
0

有一个,https://www.npmjs.com/package/json-variables

从概念上讲,它是一个函数,它接受一个字符串,JSON 内容,撒上特殊标记的变量,并生成一个解析了这些变量的字符串。就像SassLess对 CSS 所做的一样 - 它用于干燥源代码。

这是一个例子。

你会在 JSON 文件中添加这样的内容:

{
  "firstName": "customer.firstName",
  "message": "Hi %%_firstName_%%",
  "preheader": "%%_firstName_%%, look what's inside"
}

注意它是如何干燥的——价值的单一真实来源firstName

json-variables会将其处理为:

{
  "firstName": "customer.firstName",
  "message": "Hi customer.firstName",
  "preheader": "customer.firstName, look what's inside"
}

也就是说,Hi %%_firstName_%%firstName在根级别查找(但同样,它可能是更深的路径,例如data1.data2.firstName)。还解决“冒泡”到根级别,您还可以使用自定义数据结构等等。

JSON 处理任务难题的缺失部分是:

  • 意味着合并多个 JSON 文件,各种方式(object-merge-advanced
  • 编排动作的方法——如果你喜欢的编程语言是 JS , Gulp就很好
  • 表示通过路径获取/设置值(对象路径- 它的符号只使用点,没有括号key1.key2.array.2代替key1.key2.array[2]
  • 意味着在一组 JSON 文件中维护相同的一组键 - 你在一个中添加一个键,它被添加到所有其他文件(object-fill-missing-keys

在所描述的情况下,我们至少可以采用两种方法:一对多或多对多。

以前 - Gulp 可以从一个或多个类似 JSON 的源文件中“烘焙”许多 JSON 文件,json-variables从而干燥参考。

稍后 - 或者,它可以是“托管”的 JSON 文件集,呈现为一组分发文件 - Gulp 监视src文件夹,运行object-fill-missing-keys以规范化模式,甚至可能对对象进行排序(是的,有可能,排序对象)。

这一切都取决于所需的 JSON 文件集的相似程度以及如何自定义值以及是手动完成还是以编程方式完成。

于 2020-05-20T16:17:46.567 回答