Change-Id: I340486d90a1fb74e26b31f1f330f61ee2b570c43 Reviewed-on: https://cl.snix.dev/c/snix/+/30139 Autosubmit: Paul Meyer <katexochen0@gmail.com> Reviewed-by: Florian Klink <flokli@flokli.de> Tested-by: besadii
98 lines
3.2 KiB
Markdown
98 lines
3.2 KiB
Markdown
---
|
|
title: "Component Overview"
|
|
slug: overview
|
|
description: ""
|
|
summary: ""
|
|
date: 2025-03-14T14:14:35+01:00
|
|
lastmod: 2025-03-14T14:14:35+01:00
|
|
draft: false
|
|
weight: 32
|
|
toc: true
|
|
---
|
|
|
|
This diagram gives an overview over the different crates in the repository, the
|
|
different contained components and the dependencies in between them.
|
|
|
|
If you scroll further down, you find a textual description of what each component does.
|
|
Check the individual documentation pages for more details.
|
|
|
|
{{< inline-svg src="crate-diagram.svg" width="800px" height="800px" class="svg-inline-custom" >}}
|
|
|
|
|
|
## Castore
|
|
`snix-castore` is a content-addressed data storage / syncing engine.
|
|
|
|
It uses a merkle structure to store filesystem trees, as well as a chunked blob
|
|
storage for individual file contents.
|
|
|
|
It is not Nix-specific.
|
|
|
|
|
|
## Store
|
|
`snix-store` is a Nix store implementation using `snix-castore` for the
|
|
underlying data structure.
|
|
|
|
It only stores metadata like store path names, nar hashes, references,
|
|
signatures etc, and offloads content storage to `snix-castore`, by storing the
|
|
root node describing the contents.
|
|
|
|
There's also a CLI entrypoint that can be used to host a gRPC server endpoint,
|
|
copy into a store, or mount a store as a FUSE/virtiofs.
|
|
|
|
## Nix-Compat
|
|
`nix-compat` is a library providing access to various data formats, protocols
|
|
and concepts of Nix.
|
|
|
|
It does not depend on other Snix crates, making it a low-dependency crate to
|
|
include in other (non-snix) projects as well.
|
|
|
|
Other snix crates are usually the primary consumers and drive new functionality
|
|
in there - new formats etc. are usually "factored out into nix-compat".
|
|
|
|
## Builder
|
|
The builder consumes build requests from a client, runs builds and sends
|
|
logs/telemetry to the client.
|
|
|
|
There currently exists an OCI builder, as well as gRPC server adapter and client
|
|
implementations, allowing to run the builder both locally or remotely.
|
|
|
|
## Eval
|
|
`snix-eval` is a bytecode interpreter evaluator. It knows about basic Nix
|
|
language data structures and semantics, constructs bytecode and provides a VM
|
|
executing this bytecode.
|
|
|
|
It also provides some "core" builtins, though builtins are pluggable - you can
|
|
construct an evaluator and bring your own builtins.
|
|
|
|
It also defines the `EvalIO` trait and provides some very simple implementations
|
|
of it, which is how the evaluator does do IO.
|
|
|
|
|
|
## Glue
|
|
`snix-glue` provides some more builtins (those interacting with the Builder and
|
|
Store mostly).
|
|
|
|
It allows keeping `snix-eval` relatively simple.
|
|
|
|
## CLI
|
|
`snix-cli` is a REPL interface, constructing an Evaluator and populating it with
|
|
most builtins present in Nix. It is our main vehicle to evaluate Nixpkgs and
|
|
check for differences.
|
|
|
|
## Serde
|
|
`snix-serde` is a crate allowing (de)-serialisation of Rust data structures
|
|
to/from Nix. It allows you to use (a subset of) Nix as a configuration language
|
|
in/for your application.
|
|
|
|
## Tracing
|
|
`snix-tracing` contains some common tracing / logging / progress reporting code
|
|
that's used in various CLI entrypoints.
|
|
|
|
## Nar-Bridge
|
|
`nar-bridge` provides a Nix HTTP Binary cache server endpoint (read-write),
|
|
using `snix-[ca]store` to store the underlying data. It allows you to host your
|
|
own binary cache that Nix can talk to.
|
|
|
|
## Snixbolt
|
|
This uses `snix-eval`, providing a WASM bytecode explorer running in your
|
|
browser.
|