nix: reduce closure size of default package in flake.nix

Splitting the executable in a separate output avoids distributing all of
the libraries and documentation, which are not needed when just running
PostgREST.

Reduces closure size from 4.3G to 73.9M for the flake exported packages.

Resolves #4149
This commit is contained in:
Wolfgang Walther
2025-06-24 01:44:44 +00:00
committed by Laurence Isla
parent 67bd3526c2
commit de25b26f3e
3 changed files with 16 additions and 9 deletions
+10 -4
View File
@@ -62,8 +62,10 @@ let
{ name = "postgresql-12"; postgresql = pkgs.postgresql_12.withPackages (p: [ p.postgis p.pg_safeupdate ]); } { name = "postgresql-12"; postgresql = pkgs.postgresql_12.withPackages (p: [ p.postgis p.pg_safeupdate ]); }
]; ];
haskellPackages = pkgs.haskell.packages."${compiler}";
# Dynamic derivation for PostgREST # Dynamic derivation for PostgREST
postgrest = pkgs.lib.pipe (pkgs.haskell.packages."${compiler}".callCabal2nix name src { }) [ postgrest = pkgs.lib.pipe (haskellPackages.callCabal2nix name src { }) [
# To allow ghc-datasize to be used. # To allow ghc-datasize to be used.
lib.disableLibraryProfiling lib.disableLibraryProfiling
# We are never going to use dynamic haskell libraries anyway. "Dynamic" refers to how # We are never going to use dynamic haskell libraries anyway. "Dynamic" refers to how
@@ -84,9 +86,13 @@ rec {
# Derivation for the PostgREST Haskell package, including the executable, # Derivation for the PostgREST Haskell package, including the executable,
# libraries and documentation. We disable running the test suite on Nix # libraries and documentation. We disable running the test suite on Nix
# builds, as they require a database to be set up. # builds, as they require a database to be set up. We split the binary
postgrestPackage = # into a separate output, so that the default distribution via flake.nix
lib.dontCheck postgrest; # has a much smaller closure size.
postgrestPackage = pkgs.lib.pipe postgrest [
lib.dontCheck
lib.enableSeparateBinOutput
];
# Profiled dynamic executable. # Profiled dynamic executable.
postgrestProfiled = pkgs.lib.pipe postgrestPackage [ postgrestProfiled = pkgs.lib.pipe postgrestPackage [
+3 -3
View File
@@ -33,8 +33,8 @@
in in
{ {
packages = genSystems (attrs: { packages = genSystems (attrs: {
default = attrs.postgrestPackage; default = attrs.postgrestPackage.bin;
profiled = attrs.postgrestProfiled; profiled = attrs.postgrestProfiled.bin;
} // nixpkgs.lib.optionalAttrs (attrs ? postgrestStatic) { } // nixpkgs.lib.optionalAttrs (attrs ? postgrestStatic) {
static = attrs.postgrestStatic; static = attrs.postgrestStatic;
}); });
@@ -42,7 +42,7 @@
apps = genSystems (attrs: { apps = genSystems (attrs: {
default = { default = {
type = "app"; type = "app";
program = "${attrs.postgrestStatic or attrs.postgrestPackage}/bin/postgrest"; program = "${attrs.postgrestStatic or attrs.postgrestPackage.bin}/bin/postgrest";
meta.description = "REST API for any Postgres database"; meta.description = "REST API for any Postgres database";
}; };
}); });
+3 -2
View File
@@ -351,12 +351,13 @@ let
rm -f result rm -f result
if [ -z "''${PGRST_BUILD_CABAL:-}" ]; then if [ -z "''${PGRST_BUILD_CABAL:-}" ]; then
echo -n "Building postgrest (nix)... " echo -n "Building postgrest (nix)... "
nix-build -A postgrestPackage > "$tmpdir"/build.log 2>&1 || { # Using lib.getBin to also make this work with older checkouts, where .bin was not a thing, yet.
nix-build -E 'with import ./. {}; pkgs.lib.getBin postgrestPackage' > "$tmpdir"/build.log 2>&1 || {
echo "failed, output:" echo "failed, output:"
cat "$tmpdir"/build.log cat "$tmpdir"/build.log
exit 1 exit 1
} }
PGRST_CMD=./result/bin/postgrest PGRST_CMD=$(echo ./result*/bin/postgrest)
else else
echo -n "Building postgrest (cabal)... " echo -n "Building postgrest (cabal)... "
postgrest-build postgrest-build