HCL: Toolkit for Structured Configuration Languages
github.com
github.com
I also wrote BCL (https://github.com/wkhere/bcl) out of frustration with HCL :) (I didn't realize when starting it that the name "BCL" has some bad press for googlers though)
Your project looks very interesting, although we took quite different routes I guess, plus mine is at its quite early stage.
Great CLI that lets you work with CUE/Yaml/JSON, a Go SDK to get sophisticated, and WASM based bindings to unlock all the other languages.
I recommend reading The Logic of CUE to get a gist of the theory
I've built a monorepo software catalog that solves a number of the complexities in CI, manage most k8s/helm resources with CUE, and built a code gen framework on top of CUE
To me, I think want sold me was being able to build up large config values from pieces and pattern constraints, know that the system will ensure correctness, and being able to easily inspect that config. Being able to combine CUE with yaml or json in a single CLI call is super handy and helped me when advocating for adoption. You can use CUE to validate existing config or layer a bit on top before having to convince people to change their toolset
That CUE is a logical language makes the learning curve a bit stepper than most other config languages. I've kept it simple for the devs I serve and being a JSON superset makes their modifications to my code an easy ask/lift
you need a 100MB+ runtime to get started with.
But if you are already a Java shop like us, there are even more things to make your complex configs even more complex with pkl gradle plugin.
Of course, you do have to setup and install gradle, and to run gradle you need to install and setup Java JDK.
I happened to have a container that I am certain contains no Java and it fired right up
$ docker run -it --rm --entrypoint=/usr/bin/env public.ecr.aws/aws-cli/aws-cli:2.15.38 bash -c 'curl -fsSLO https://github.com/apple/pkl/releases/download/0.25.3/pkl-linux-aarch64; chmod a+x pkl-linux-aarch64; ./pkl-linux-aarch64 --help'
Usage: pkl [OPTIONS] COMMAND [ARGS]...I don't think inheritance is a flaw at all here. It makes a lot of sense to build configuration up from base definitions, especially when you account for its merge syntax.
I've been using it for k8s manifests a la customize. The biggest pain point for me is the lack of flat member syntax when updating deeply nested fields.
Something that's caught my eye is KCL, which seems similar, but maybe a bit more mature?
Most tools and languages that advertise themselves as being a replacement (either for HCL, or Terraform wholesale) are pretty bad in various ways, have no traction (for whatever reason) or lack actual real world usage. One of the biggest things people seem to skip over is the way in which non-software-developers can actually still use it if they come from a sysadmin background. In a way, HCL protects them from falling into the imperative language trap and having to learn software development before being able to do any IaC at all. It's not realistic, and it doesn't work with the people that are already in the field, at scale.
Some tools like SaltStack try to do both, but you end up in the same place where Ansible lives: hiding your declarations in template languages or extensions in imperative languages, at which point you might as well skip the IaC interface and go straight to python or something like that.
If you need convincing of the ill-considered nature of HCL, go look at the discussion around adding deep map merge support to terraform and the suggestions to use a third-party provider for this.
In fact I will use a real programming language for IaC over pretty much anything, as long as the language has an expressive type system and allows declarative idioms.
Great experience if one happens to be the lucky engineer on bench and called in to help out.