Hello World
Standard features a special project structure
that brings some awesome innovation
to this often overlooked (but important) part of your project.
With the default Cell Blocks, an apps.nix
file tells Standard
that we are creating an Application.
flake.nix
is in charge
of explicitly defining
the inputs of your project.
Btw, you can can copy * the following files from here.
* don't just clone the
std
repo: flakes in subfolders don't work that way.
/tmp/play-with-std/hello-world/flake.nix
{
inputs.std.url = "github:divnix/std";
inputs.nixpkgs.url = "nixpkgs";
outputs = {std, ...} @ inputs:
std.grow {
inherit inputs;
cellsFrom = ./cells;
};
}
/tmp/play-with-std/hello-world/cells/hello/apps.nix
{
inputs,
cell,
}: {
default = inputs.nixpkgs.stdenv.mkDerivation rec {
pname = "hello";
version = "2.10";
src = inputs.nixpkgs.fetchurl {
url = "mirror://gnu/hello/${pname}-${version}.tar.gz";
sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";
};
};
}
$ cd /tmp/play-with-std/hello-world/
$ git init && git add . && git commit -m"nix flakes only can see files under version control"
# fetch `std`
$ nix shell github:divnix/std
$ std //hello/apps/default:run
Hello, world!
You see? from nothing to running your first application in just a few seconds ✨
Assumptions
This example consumes the following defaults or builtins:
[Default cellBlocks
][grow-nix-default-cellblocks]
{
cellBlocks ? [
(blockTypes.functions "library")
(blockTypes.runnables "apps")
(blockTypes.installables "packages")
],
...
} @ args:
[Default systems
][grow-nix-default-systems]
{
systems ? [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
],
...
} @ cfg: