BuckarooDocsBlog

Goodbye JSON, Hello TOML

For the next version of Buckaroo, we wanted to make improvements to the manifest format. Old versions of Buckaroo used JSON for the manifest and lock-files. This choice was not made very consciously, but at the time it seemed reasonable:

  • Yarn and NPM (arguably the most successful language package managers) both use JSON.
  • There is a JSON parser for literally every language (and usually more than one).
  • Everyone is familiar with JSON.

Over time, we've come to regret this decision:

  • JSON is tedious to edit by hand, since objects must be closed with curly braces.
  • JSON does not support comments.
  • Large JSON files can be difficult to read.

So we started looking for an alternative.

Amoungst newer package managers (Cargo, Dep), there is a clear winner: TOML. Tom's Obvious, Minimal Language (yes, the name is a tad egotistical)...

... aims to be a minimal configuration file format that's easy to read due to obvious semantics. TOML is designed to map unambiguously to a hash table. TOML should be easy to parse into data structures in a wide variety of languages.

Already we have found it more convenient when tweaking packages over on buckaroo-pm. Often the TOML is a bit longer, but it's so much easier to read and edit!

Here's a side-by-side comparison:

{
  "name": "satori",
  "dependencies": {
    "libuv/libuv": "1.11.0",
    "google/gtest": "1.8.0",
    "nodejs/http-parser": "2.7.1",
    "madler/zlib": "1.2.11",
    "loopperfect/neither": "0.4.0",
    "loopperfect/r3": "2.0.0"
  }
}

And the TOML:

targets = [ "//:satori" ]

[[dependency]]
package = "github.com/buckaroo-pm/google-googletest"
version = "branch=master"
private = true

[[dependency]]
package = "github.com/buckaroo-pm/libuv"
version = "branch=v1.x"

[[dependency]]
package = "github.com/buckaroo-pm/madler-zlib"
version = "branch=master"

[[dependency]]
package = "github.com/buckaroo-pm/nodejs-http-parser"
version = "branch=master"

[[dependency]]
package = "github.com/loopperfect/neither"
version = "branch=master"

[[dependency]]
package = "github.com/loopperfect/r3"
version = "branch=master"

But the biggest improvement is when fixing a Git merge. Unlike JSON, each line of TOML is largely self-contained. Without having to worry about trailing commas or closing braces, Git will get things right far more often. This is a huge relief when updating lock-files.

TOML files are use in Buckaroo v2 upwards. Let us know what you think! 💖

BuckarooDocsGitHub

Sign up for our Newsletter

Get the latest updates about new packages and Buckaroo releases.
Powered by LoopPerfect