just
Just is a general purpose command runner with syntax inspired by make
.
Tasks are configured via an attribute set where the name is the name of the task
(i.e. just <task>
) and the value is the task definition (see below for an
example). The generated Justfile
should be committed to allow non-Nix users to
on-ramp without needing access to Nix.
Task dependencies (i.e. treefmt
below) should be included in packages
and
will automatically be picked up in the devshell.
{ inputs, cell }:
let
inherit (inputs.std) nixpkgs std;
in
{
default = std.lib.mkShell {
/* ... */
nixago = [
(std.nixago.just {
packages = [ nixpkgs.treefmt ];
configData = {
tasks = {
fmt = {
description = "Formats all changed source files";
content = ''
treefmt $(git diff --name-only --cached)
'';
};
};
};
})
];
};
}
It’s also possible to override the interpreter for a task:
{
# ...
hello = {
description = "Prints hello world";
interpreter = nixpkgs.python3;
content = ''
print("Hello, world!")
'';
};
}
# ...
Definition:
{
inputs,
cell,
}: let
inherit (inputs) nixpkgs;
l = nixpkgs.lib // builtins;
in {
configData = {};
apply = d: let
# Transforms interpreter attribute if present
# nixpkgs.pkgname -> nixpkgs.pkgname + '/bin/<name>'
getExe = x: "${l.getBin x}/bin/${x.meta.mainProgram or (l.getName x)}";
final =
d
// {
tasks =
l.mapAttrs
(n: v:
v // l.optionalAttrs (v ? interpreter) {interpreter = getExe v.interpreter;})
d.tasks;
};
in {
data = final; # CUE expects structure to be wrapped with "data"
};
format = "text";
output = "Justfile";
packages = [nixpkgs.just];
hook = {
mode = "copy";
};
engine = inputs.nixago.engines.cue {
files = [./just.cue];
flags = {
expression = "rendered";
out = "text";
};
postHook = ''
${l.getExe nixpkgs.just} --unstable --fmt -f $out
'';
};
}