Chapter 14

 §4. Overlays

Overlays

Overlaysという仕組みを利用することでNixpkgsを拡張・上書きすることができます。Nixpkgsにパッチを適用したり、新しいパッケージを追加したりできます。

OverlayはFlakeのoutputsのoverlays attributeからエクスポートされます。

Flakeのoutputs
overlays.<overlayの名前> = final: prev: #...

Overlayを使ってみる

例としてNURを使ってみます。NUR(Nix User Repository)はコミュニティ駆動のパッケージリポジトリで、4000近いパッケージを公開しています。NUR本体ではメンテナンスやレビューを行っておらず、ユーザーが自身のリポジトリをNURに紐付け、NURがそれを定期的に同期するという仕組みになっています(面白いことにMozillaもリポジトリを登録しています)。

https://nur.nix-community.org

これまではnixpkgs.legacyPackages.${system}という形でNixpkgsのパッケージを参照していましたが、overlayを利用する場合はimport nixpkgsを使います。

flake.nix
{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    nur.url = "github:nix-community/NUR";
  };

  outputs =
    {
      nixpkgs,
      flake-utils,
      nur,
      ...
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        # `nur.overlays.<overlayの名前>`ではなく`nur.overlay`
        # `outputs.overlay`は現在非推奨だが恐らく後方互換性のために残されている
        overlays = [ nur.overlay ];
        pkgs = import nixpkgs { inherit system overlays; };
      in
      {
        packages = {
          default = pkgs.nur.repos.mic92.hello-nur;
        };
      }
    );
}

NURをoverlayとして追加すると、pkgs.nurからNURのパッケージを参照できるようになります。このflake.nixではNURのメンテナーであるMic92氏が提供しているhello-nurを再エクスポートしています。実行してみましょう。

hello-nurの実行
$ nix run
Hello, NUR!

他にも様々なoverlayが存在するので、興味があれば調べてみてください。