Flake Parts: Difference between revisions

Frontear (talk | contribs)
Introduce flake-parts to the wiki, and exemplify its power while providing a little more explanation than what the flake-parts webpage itself provides.
 
Malix (talk | contribs)
m add benefit
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[https://github.com/hercules-ci/flake-parts Flake Parts] is a framework that leverages the NixOS [[NixOS modules|module system]] to write modular and organized [[flakes]]. It provides options that represent standard flake attributes and establishes an easy way to work with <code>system</code>. It is a minimal and very lightweight mirror of the flake schema.
[https://github.com/hercules-ci/flake-parts Flake Parts] is a framework that leverages the NixOS [[NixOS modules|module system]] to write modular and organized [[flakes]]. It provides options that represent standard flake attributes and establishes an easy way to work with <code>system</code>. It is a minimal and very lightweight mirror of the flake schema.


The major benefit of flake-parts is being able to write modular flakes with the full power of the module system. It is a great option and alternative to [https://github.com/numtide/flake-utils flake-utils], a wrapper which is largely [https://ayats.org/blog/no-flake-utils discouraged] from being used.
The major benefit of flake-parts is being able to write modular flakes with the full power of the module system, with error handled. It is a great option and alternative to [https://github.com/numtide/flake-utils flake-utils], a wrapper which is largely [https://ayats.org/blog/no-flake-utils discouraged] from being used.
 
There is documentation available for a variety of flake-parts powered modules available on https://flake.parts.


== Getting Started ==
== Getting Started ==
Line 35: Line 37:


     flake = {
     flake = {
       # A fallback attribute for non-system specific
       # The usual flake attributes can be defined here, including
       # flake attributes (like check, formatter, nixosConfigurations, etc)
       # system-agnostic and/or arbitrary outputs.
     };
     };


Line 43: Line 45:
   };
   };
}
}
</syntaxhighlight>
== Writing Modules ==
Modules are written in exactly the same way as NixOS modules. The main exposed attributes are <code>perSystem</code> and <code>flake</code>. You can reference the <code>self</code> and <code>inputs</code> attribute at the top-level, though generally you will likely not need it. An example of writing a module can be seen below:<syntaxhighlight lang="nix">
# flake/packages.nix
{ self, inputs, ... }: {
  perSystem = { pkgs, ... }: {
    packages.hello = pkgs.hello;
  };
}
</syntaxhighlight>The above module can then be imported and referenced in the main flake (or other modules)<syntaxhighlight lang="nix">
# flake.nix
{
  inputs = {
    flake-parts.url = "github:hercules-ci/flake-parts";
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };
  outputs = { flake-parts, ... } @ inputs: flake-parts.lib.mkFlake { inherit inputs; } {
    imports = [
      ./flake/packages.nix
    ];
    systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
  };
}
</syntaxhighlight>On evaluation the flake will expose 4 distinct outputs under packages:<syntaxhighlight lang="console">
$ nix flake show --all-systems
path:/path/to/flake.nix?lastModified=omitted&narHash=omitted
└───packages
    ├───aarch64-darwin
    │  └───hello: package 'hello-2.12.1'
    ├───aarch64-linux
    │  └───hello: package 'hello-2.12.1'
    ├───x86_64-darwin
    │  └───hello: package 'hello-2.12.1'
    └───x86_64-linux
        └───hello: package 'hello-2.12.1'
</syntaxhighlight>
</syntaxhighlight>


Line 48: Line 88:


* [https://flake.parts/ Introduction] - flake-parts
* [https://flake.parts/ Introduction] - flake-parts
[[Category:Flakes]]