flake-like toml nix pins, lazily fetched and transformed
maintains pins.toml (what you want) and pins.lock.json (what's fetched),
plus an inputs.nix resolver to consume locked inputs without nix's flake
machinery
tack init writes three files to the current dir (or $TACK_DIR)
pins.tomlinputs and shorturl schemes, hand-editablepins.lock.jsonresolved inputs, written bytack update, read by nixinputs.nixthe resolver;import ./inputs.nixgives a name -> input attrset
flake-free config
let inputs = import ./inputs.nix;
in inputs.nixpkgs.legacyPackages.x86_64-linux.helloor a flake
outputs = { self }:
let inputs = import ./inputs.nix; in {
packages.x86_64-linux.default =
inputs.nixpkgs.legacyPackages.x86_64-linux.hello;
};tack init [--force]
tack update [names...] fetch latest, rewrite lock
tack look [names...] report pins with newer upstream revs
tack add <name> <url> [--no-flake] [--dir <d>] [--submodules] [--follows c=p]...
tack rm <name>
tack alias <name> <template> define a shorturl scheme
tack alias --rm <name> remove one
github:owner/repo[/ref]tarball via codeloadgit+https://.../git+ssh://...any git remote;?ref=<branch>/?rev=<sha>to pin,submodules = trueto recursehttps://.../http://...raw tarball, where the format is inferred from the extension (e.g..tar,.tar.gz/.tgz,.tar.xz/.txz).
scheme:rest expands by substituting rest into the template {path}
[shorturls]
gh = "github:{path}"
[inputs.coolproject]
url = "gh:owner/coolproject"point a pin's input at one of your top-level pins instead of its own lock
[inputs.foo]
url = "gh:owner/foo"
follows = { nixpkgs = "nixpkgs" } # foo's nixpkgs -> your nixpkgs pinall_follow applies a rule to every pin that has a matching input
[all_follow]
nixpkgs = "nixpkgs" # every input named nixpkgs follows your nixpkgs pin
[inputs.bar]
url = "gh:owner/bar"
exclude_follow = ["nixpkgs"] # ...except bar'snix develop # rust toolchain + openssl/libgit2
nix build # the binary
EUPL-1.2. see LICENSE