Pkl:Apple 新配置语言,可以取代 JSON 和 YAML

banq

Pkl (发音为“Pickle”)是 Apple 对配置即代码的诠释。它介于 JSON 等传统格式和 Python 等完整编程语言之间,旨在使配置更可靠、更易于维护。

Pkl 之所以吸引我的注意,是因为它并没有试图成为另一种通用编程语言。相反,它专注于解决一个特定问题:让配置变得不那么麻烦。

作为一个曾经无数次为 YAML 缩进和 JSON 缺少注释而苦恼的人,我对 Apple 通过 Pkl 带来的变化感到好奇。

Pkl 有何不同?
配置文件通常一开始很简单,但随着时间的推移会变得越来越复杂。想想一个典型的部署配置 - 它可能从几个环境变量开始,但会演变成涵盖多个服务的数百行。YAML 和 JSON 难以应对这种复杂性,而一般的编程语言可能会过于复杂。

Pkl 不仅仅是另一种配置格式。它是静态配置格式(如 JSON/YAML)和编程语言的混合体。你可以认为它具有 YAML 的简单性,但又具有在你需要时真正执行操作的能力。


// Basic config
name = "My Service"
port = 8080

// Template for shared settings
baseService {
  image = "nginx:1.19"
  healthCheck = true
}

// Reuse template for specific services
webService = new baseService {
  port = 80
}

apiService = new baseService {
  port = 3000
}

上面的代码展示了 Pkl 的混合特性。它与 YAML 一样可读,但像编程语言一样支持抽象和重用。

Pkl 强制执行不变性 - 一旦定义了值,就无法更改。这可以防止一整类配置错误,即值被意外修改。该语言还包括通过架构进行的内置验证:


class DatabaseConfig {
  host: String
  port: Int

  function validate() {
    port > 0 && port < 65536
  }
}

该模式在评估时验证您的配置,在错误进入生产之前捕获它们。

Pkl 旨在适应现有的工作流程。它可以输出 JSON、YAML、XML 和 Java Properties 文件。这意味着您可以使用 Pkl 为需要这些格式的工具生成配置。它还提供多种语言的集成库:

  1. JVM (Java and Kotlin)
  2. Swift
  3. Go

这些库让应用程序直接读取和解析 Pkl 配置,无需中间 JSON 或 YAML 文件。

考虑一个常见的微服务设置。每个服务可能需要类似但略有不同的配置。在 YAML 中,这通常会导致复制粘贴块并进行微小更改。Pkl 通过继承和组合更优雅地处理此问题。


// Base application config with shared defaults
class AppConfig {
  port: Int = 8080
  logLevel: String = "INFO"
  timeout: Duration = Duration.seconds(30)
}

// Specific service config
api = new AppConfig {
  port = 3000
  timeout = Duration.minutes(2)
}

语法虽然简洁,但却引入了另一种做事方式。 我们已经有了 YAML、TOML、JSON5 和 HCL。 它们都承诺解决配置问题,但现在又出现了另一个竞争者。

配置领域的这种碎片化实际上可能会使情况变得更糟,而不是更好。 验证功能虽然令人印象深刻,但也可以通过 JSON Schema 或 OpenAPI 规范来实现,这些工具已经得到了业界的广泛采用和支持。

Pkl 真的能解决现有工具无法解决的问题吗?
纵观苹果公司自己的生态系统,有趣的是他们主要使用信息属性列表和 JSON 进行平台配置。 如果 Pkl 有如此显著的改进,为什么苹果公司自己的产品没有更广泛地使用它呢?