nix3-why-depends(1)
π nix3-why-depends(1) β like, the manual page, but make it make sense π
okay bestie, welcome to the nix3-why-depends page from the General Commands Manual β¨
β οΈ Warning β this program is experimental and its interface is subject to change. yes fr, they said it, not me π
πΈ NAME πΈ
nix why-depends β show why a package has another package in its closure π
π¦ SYNOPSIS π¦
nix why-depends [optionβ¦] package dependency
β¨ EXAMPLES β¨
okay so here's where it gets good π
- Show one path through the dependency graph leading from Hello to Glibc:
# nix why-depends nixpkgs#hello nixpkgs#glibc
/nix/store/10l19qifk7hjjq47px8m2prqk1gv4isy-hello-2.10
ββββbin/hello: β¦...................../nix/store/kmmr0ggkywxvnad4z1chqb6lsxi6pqgc-glibc-2.32/lib/ld-linux-x86-64.β¦
β /nix/store/kmmr0ggkywxvnad4z1chqb6lsxi6pqgc-glibc-2.32
- Show all files and paths in the dependency graph leading from Thunderbird to libX11:
# nix why-depends --all nixpkgs#thunderbird nixpkgs#xorg.libX11
/nix/store/0my2p7psgdzqc5pq6dyl4ld9w6g0np58-thunderbird-78.5.1
ββββlib/thunderbird/libxul.so: β¦6wrw-libxcb-1.14/lib:/nix/store/jmwiq1bb3n47a0css8b1q7lhgf7416k5-libX11-1.7.0/lib:/nix/store/ssfβ¦
β β /nix/store/jmwiq1bb3n47a0css8b1q7lhgf7416k5-libX11-1.7.0
ββββlib/thunderbird/libxul.so: β¦pxyc-libXt-1.2.0/lib:/nix/store/l1sv43bafhkf2iikmdw9y62aybjdhcmm-libXdamage-1.1.5/lib:/nix/storeβ¦
β β /nix/store/l1sv43bafhkf2iikmdw9y62aybjdhcmm-libXdamage-1.1.5
β ββββlib/libXdamage.so.1.1.0: β¦-libXfixes-5.0.3/lib:/nix/store/jmwiq1bb3n47a0css8b1q7lhgf7416k5-libX11-1.7.0/lib:/nix/store/9l0β¦
β β β /nix/store/jmwiq1bb3n47a0css8b1q7lhgf7416k5-libX11-1.7.0
β¦
- Show why Glibc depends on itself (yes, it's giving main character energy π«Ά):
# nix why-depends nixpkgs#glibc nixpkgs#glibc
/nix/store/q9mknq836i0kblq8g1hm9f3cv9qda0r9-glibc-2.31
ββββlib/ld-2.31.so: β¦che Do not use /nix/store/q9mknq836i0kblq8g1hm9f3cv9qda0r9-glibc-2.31/etc/ld.so.cache. --β¦
β /nix/store/q9mknq836i0kblq8g1hm9f3cv9qda0r9-glibc-2.31
- Show why Geeqie has a build-time dependency on systemd:
# nix why-depends --derivation nixpkgs#geeqie nixpkgs#systemd
/nix/store/drrpq2fqlrbj98bmazrnww7hm1in3wgj-geeqie-1.4.drv
ββββ/: β¦atch.drv",["out"]),("/nix/store/qzh8dyq3lfbk3i1acbp7x9wh3il2imiv-gtk+3-3.24.21.drv",["dev"]),("/β¦
β /nix/store/qzh8dyq3lfbk3i1acbp7x9wh3il2imiv-gtk+3-3.24.21.drv
ββββ/: β¦16.0.drv",["dev"]),("/nix/store/8kp79fyslf3z4m3dpvlh6w46iaadz5c2-cups-2.3.3.drv",["dev"]),("/nixβ¦
β /nix/store/8kp79fyslf3z4m3dpvlh6w46iaadz5c2-cups-2.3.3.drv
ββββ/: β¦.3.1.drv",["out"]),("/nix/store/yd3ihapyi5wbz1kjacq9dbkaq5v5hqjg-systemd-246.4.drv",["dev"]),("/β¦
β /nix/store/yd3ihapyi5wbz1kjacq9dbkaq5v5hqjg-systemd-246.4.drv
π DESCRIPTION π
okay so here's the lore πβ¨
Nix automatically figures out the potential runtime dependencies between store paths by scanning for the hash parts of store paths. Like, say there's a store path /nix/store/q9mknq836i0kblq8g1hm9f3cv9qda0r9-glibc-2.31, and some file inside another store path contains the string q9mknq83β¦ β then that other store path refers to the first one, and therefore might need it at runtime. Nix always keeps the existence of the transitive closure of a store path under the references relationship, so it is not possible to install a store path without having all of its references present. periodt π
Sometimes Nix packages end up with unexpected runtime dependencies β like, a reference to a compiler accidentally ends up in a binary, which drags it into the latter's closure. that kinda closure size bloat? undesirable. not the vibe. π
nix why-depends lets you diagnose the cause of issues like that π©Ί It shows why the store path package depends on the store path dependency, by showing a shortest sequence in the references graph from the former to the latter. And also, for each node along this path, it shows a file fragment containing a reference to the next store path in the sequence. lowkey iconic π₯
To show why derivation package has a build-time rather than runtime dependency on derivation dependency, use --derivation.
π OPTIONS π
--all,-aβ show all the edges in the dependency graph leading from package to dependency, instead of just a shortest path.--preciseβ for each edge in the dependency graph, show the files in the parent that cause the dependency.
π Common evaluation options π
--argname expr β pass the value expr as the argument name to Nix functions.--arg-from-filename path β pass the contents of file path as the argument name to Nix functions.--arg-from-stdinname β pass the contents of stdin as the argument name to Nix functions.--argstrname string β pass the string string as the argument name to Nix functions.--debuggerβ start an interactive environment if evaluation fails.--eval-storestore-url β the URL of the Nix store to use for evaluation, i.e. to store derivations (.drvfiles) and inputs referenced by them.--impureβ allow access to mutable paths and repositories.--include,-Ipath β add path to search path entries used to resolve lookup paths.
This option may be given multiple times.
Paths added through -I take precedence over the nix-path configuration setting and the NIX_PATH environment variable.
--override-flakeoriginal-ref resolved-ref β override the flake registries, redirecting original-ref to resolved-ref.
π¦ Common flake-related options π¦
--commit-lock-fileβ commit changes to the flake's lock file.--inputs-fromflake-url β use the inputs of the specified flake as registry entries.--no-registriesβ don't allow lookups in the flake registries.
DEPRECATED β use --no-use-registries instead.
--no-update-lock-fileβ do not allow any updates to the flake's lock file.--no-write-lock-fileβ do not write the flake's newly generated lock file.--output-lock-fileflake-lock-path β write the given lock file instead offlake.lockwithin the top-level flake.--override-inputinput-path flake-url β override a specific flake input (e.g.dwarffs/nixpkgs). The input-path must not be empty. This implies--no-write-lock-file.--recreate-lock-fileβ recreate the flake's lock file from scratch.
DEPRECATED β use nix flake update instead.
--reference-lock-fileflake-lock-path β read the given lock file instead offlake.lockwithin the top-level flake.--update-inputinput-path β update a specific flake input (ignoring its previous entry in the lock file).
DEPRECATED β use nix flake update instead.
πΈ Logging-related options πΈ
--debugβ set the logging verbosity level todebug.--log-formatformat β set the format of log output; one ofraw,internal-json,barorbar-with-logs.--print-build-logs,-Lβ print full build logs on standard error.--quietβ decrease the logging verbosity level.--verbose,-vβ increase the logging verbosity level.
π§ Miscellaneous global options π§
--helpβ show usage information.--offlineβ disable substituters and consider all previously downloaded files up-to-date.--optionname value β set the Nix configuration setting name to value (overridingnix.conf).--refreshβ consider all previously downloaded files out-of-date.--repairβ during evaluation, rewrite missing or corrupted files in the Nix store. During building, rebuild missing or corrupted store paths.--versionβ show version information.
π Options that change the interpretation of installables π
--derivationβ operate on the store derivation rather than its outputs.--exprexpr β interpret installables as attribute paths relative to the Nix expression expr.--file,-ffile β interpret installables as attribute paths relative to the Nix expression stored in file. If file is the character-, then a Nix expression is read from standard input. Implies--impure.
π Note β see man nix.conf for overriding configuration settings with command line flags.
aaaand that's the whole page bestie, you ate that π
β¨ this was nix3-why-depends(1) from the General Commands Manual β go forth and debug your closures, ily π«Άπ
π¦ where this page comes from
- fedora 44: nix-core 2.35.3-2.fc44 Β· LGPL-2.1-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms