Cheat Sheet
Flake-parts offers a couple of ways to access the same thing. This gives you freedom to pick the most convenient syntax for a use case.
This page is for you to get a feel for what's what.
Get a locally defined package
Getting the locally defined hello package on/for an x86_64-linux host:
On the command line
nix build .#hello
In perSystem
config.packages.hello
self'.packages.hello
The self' parameter is derived from the flake self, which may benefit from evaluation caching in the future.
The config parameter is conceptually simpler and lets you access all options inside perSystem, including unexposed ones if you're into defining such options.
In the top level
Note
Anything you can do at the top level, you can do in
perSystemas well, although you may have to@match those module arguments.For example, change the top level function header to e.g.
toplevel@{ config, ... }: /*...*/so you can accesstoplevel.configdespite plainconfigbeing shadowed byperSystem = { config, ... }: /*...*/.
Examples:
(getSystem "x86_64-linux").packages.hello
withSystem "x86_64-linux" ({ config, ... }:
config.packages.hello
)
self.x86_64-linux.packages.hello
allSystems.x86_64-linux.packages.hello
allSystems may not be future proof if Nix starts to allow building for all systems. An opened up system is incompatible with enumerated systems as required by an attribute set.