If you don't have correct caching of intermediate build artifacts, a system can't handle the compile and test requirements of large codebases.
I wouldn't say moon is hermetic, nor are we trying to be. We don't use the sandbox approach for tasks, and run against the original files. For the languages we support, this works best.
As for deterministic, we try to be. We have a "toolchain" where we download languages/tools in the background, and run tasks using these tools. This ensures, at minimum, that the same version/variant of a tool is used across machines.
> In the same vein as those questions how does caching work?
It's content based. We also hash other kinds of inputs depending on the language that is running.
> If the configuration language is YAML how am I expected to implement new behavior? (and other questions)
Our focus right now is on non-compiled languages, primarily web languages, where custom behavior (like Starlark) is not necessary. In the future, this may change.
Also a bit disingenuous to describe it as language agnostic if it only really works with non-compiled languages.
It's also language agnostic because you can technically run anything through moon, but support may vary. https://moonrepo.dev/docs/faq#can-we-run-other-languages
But you can only reliably know what is affected through hermeticity.
> It's also language agnostic because you can technically run anything through moon
That's just calling out to another build system though. I don't think it really counts.
I say this as someone who wants to love bazel... I just can't understand why it picks up impure toolchains from the system at all.
Combine that with the fact that C++ toolchains at least make assumptions all over the place about being spewed over `/usr`... I think they just bowed out to practicality at that point.
You're definitely right it should use hermetic toolchains. I'm curious which other Bazel-like build system does that by default?
I don't think it was easy, though.
Given its Google-internal predecessors, it’s not clear how priority should be established (the general guideline in science is that non-public is not science, but that might not be what we care about here). The public Bazel, though, is from 2015, while the first releases of Nix date back all the way to 2004[1] and the thesis is from 2006.
Now Nix is not really at its best if used as a general-purpose build system, but it certainly has and uses hermetic toolchains.
[1] https://releases.nixos.org/nix/nix-0.5/manual/manual.html
In the same vein as those questions how does caching work? Is it content based like Bazel or mtime like Nx et al? If there is no sandboxing does it do input tracking or is there manual "cache key" shenanigans?
If the configuration language is YAML how am I expected to implement new behavior? Is that in Rust? Is there a plugin architecture? Do I need to rebuild the tool itself and redistribute it to my build machines and developers? The main appeal of Starlark/Python in build systems is ability to create macros or in many cases define entirely new rulesets to support new tools and languages without needing to modify the complex and performance sensitive core.
Sorry for the skeptisicm but build systems are very complex beasts and new entrants like Nx don't measure up to tools like Bazel very well.