Flake Compat
Flake Compat is a compatibility layer for Nix Flakes that lets projects written in the old style Nix (default.nix and shell.nix) use inputs and outputs from flake style Nix setups.
The flake-compat library downloads the inputs of the flake, pass them to the flake’s outputs function and return an attribute set containing defaultNix and shellNix attributes. The attributes will contain the output attribute set with an extra default attribute pointing to current platform’s defaultPackage (resp. devShell for shellNix).
Usage
To integrate flake-compat into a project, place the following into default.nix (for shell.nix, replace defaultNix with shellNix) to use the shim:
(import
(
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
nodeName = lock.nodes.root.inputs.flake-compat;
in
fetchTarball {
url = lock.nodes.${nodeName}.locked.url or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.${nodeName}.locked.rev}.tar.gz";
sha256 = lock.nodes.${nodeName}.locked.narHash;
}
)
{ src = ./.; }
).defaultNix
Then in your flake.nix, add flake-compat.url = "github:edolstra/flake-compat"; to your inputs.
Example usage
An example flake.nix that packages a simple shell script:
{
description = "A very basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
flake-compat.url = "github:edolstra/flake-compat";
};
outputs = { self, nixpkgs, flake-compat }:
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
in {
packages.x86_64-linux.hello = pkgs.stdenv.mkDerivation {
pname = "hello";
version = "1.0";
src = ./hello.sh;
unpackPhase = "true";
installPhase = ''
mkdir -p $out/bin
cp $src $out/bin/hello
chmod +x $out/bin/hello
'';
};
packages.x86_64-linux.default = self.packages.x86_64-linux.hello;
};
}
The shell script being packaged:
#!/usr/bin/env sh
echo "Hello"
With this setup, running nix run will build and execute the flake as expected. When using flake-compat, it becomes possible to run traditional commands like nix-build which will return a derivation using the flake’s output definitions.