Skip to content

Flakes 入門

flakes の実験的な機能は Nix における大きな進展です。flakes は Nix 式の間の依存関係を管理するためのポリシーを導入し、再現性、構成可能性、使いやすさを向上させることができます。flakes はまだ、実験的な機能ですが Nix コミュニティの間で広く使われています。[1]

Flakes は nix プロジェクト始まって以来最も大きな変化の1つです。[2]

簡単に説明していきます。もし JavaScript/Go/Rust/Python などの言語の経験があれば package.json/go.mod/Cargo.toml/pyproject.toml のようなファイルに親しみがあるでしょう。これらのファイルにはソフトウェアパッケージ間の依存関係とプロジェクトのビルドの仕方が記述されています。

同様に、このような言語のパッケージマネージャは依存関係のバージョンのロックをし、プロジェクトの再現性を担保するために package-lock.json/go.sum/Cargo.lock/poetry.lock のようなファイルを利用します。

Flakes は Nix のエコシステムの再現性、構成可能性、使いやすさを強化するためにこのようなパッケージマネージャから着想を得ました。

Flakes では flake.nix を導入することで、Nix パッケージ間の依存関係やプロジェクトのビルド方法を記述しています (package.json のようなものです) 。さらに、flake.lock を用いて依存するバージョンをロックし、プロジェクトの再現性を担保しています (package-lock.json のようなものです) 。

とはいえ、Flakes の実験的な機能は Nix 本来の設計をユーザレベルで壊すものではありません。 Flakes が導入する2つのファイル flake.nix/flake.lock は、他の Nix の設定の単なるラッパーに過ぎません。以降の章では、Flakes を使うことで、より便利な方法で Nix 式間の依存関係を Nix 本来の設計に基づいて管理できるようになることを見ていきます。

Flakes における注意事項 caution

Flakes の利点ははっきりとしていて、Flakes は NixOS コミュニティ全体で受け入れられてきました。現在では、半分以上のユーザが Flakes を活用していて[3]、Flakes はこれからも活用されていくでしょう。

⚠️ しかし、Flakes が未だに実験的な機能 であることは覚えておくべきです。Flakesにはいくつか問題もあり、安定化の最中に破壊的変更が行われる可能性もあります。このような破壊的変更の程度は不確かなままです。

特にこの本は NixOS と Flakes を中心として構成されていることもあり、総合的に、私は Flakes を利用することを強く推奨します。しかし、今後の破壊的変更によって起こりうる潜在的な問題へ備えることも重要です。

いつ Flakes は安定するの?

Flakes の詳細についていくらか掘り下げました。

これらの情報から、Flakes はいくらかの破壊的変更の可能性はありますが、ここ2年以内には安定するのではないかと思われます。

新しい CLI と 従来の CLI

Nix は 2020年に nix-commandflakes の2つの実験的な機能を導入しました。これによって、新しい command-line インターフェース (新しい CLI)、標準化された Nix パッケージの構造定義 (Flakes の機能)、cargo/npm のバージョンをロックするファイルと同様の flake.lock のような機能といったものがもたらされています。これらの機能は Nix の潜在能力を大きく引き出すことができ、2024年2月1日時点で実験段階ですが Nix コミュニティの間で広く受け入れられています。

現在の Nix の新しい CLI (nix-command の実験的な機能) は Flakes と強く結びついています。この CLI と Flakes を明示的に切り離そうとする運動もありますが、Flakes を使う際にはどうしても新しい CLI を使う必要があります。この本は、NixOS と Flakes の入門者向けのガイドであるので、Flakes が依存している新しい CLI と従来の CLI との違いについて解説する必要があります。

ここでは、新しい CLI (nix-command) と Flakes を使う上で、もはや必要なくなった従来の CLI について羅列しています。これらのコマンドは、対応する新しい CLI に置き換えることができます (しかし、nix-collect-garbage については現在代用のコマンドはありません):

  1. nix-channel: apt/yum/pacman のような他のパッケージ管理ツールのように nix-channel はソフトウェアパッケージのバージョンを stable/unstable/test チャンネルを用いて管理することができます。
    1. Flakes では、nix-channel の機能は flake.nixinputs セクションで完全に置き換えることができます。
  2. nix-env: nix-env は従来の Nix のユーザ環境のソフトウェアパッケージを管理するための CLI ツールです。
    1. nix-channel によって加えたデータソースからのパッケージのインストールを行います。この際、パッケージのバージョンはこのチャンネルに影響を受けます。 nix-env を用いたインストールでは Nix の宣言的な設定に自動的に記録されず、Nix の設定の制御下に置かれないので、他のコンピュータへの複製は大変になります。このことから、このコマンドを直接使用することはおすすめしません。
    2. これに対応する新しい CLI のコマンドは nix profile です。ですが、個人的には入門者にはおすすめしません。
  3. nix-shell: nix-shell は一時的なシェル環境を作り出すことだでき、開発やテストに便利です。
    1. 新しい CLI では、3つのサブコマンド: nix develop, nix shell, nix run に分けられます。これらのコマンドについては、"開発環境" の章で議論していきます。
  4. nix-build: nix-build は Nix パッケージをビルドし、ビルド成果物を /nix/store に格納します。しかし、このビルド成果物は Nix の宣言的な設定には記録されません。
    1. 新しい CLI では nix-buildnix build で置き換えられます。
  5. nix-collect-garbage: ガベージコレクションコマンドは、/nix/store 内の使われていないストアオブジェクトを一掃します。
    1. 新しい CLI にも nix store gc --debug という似たようなコマンドが存在しますが、このコマンドは Nix のプロファイル世代を削除しないので完全な代用のコマンドは現在のところありません。
  6. 他のマイナーなコマンドについてはここでは扱いません。
    1. nixのコマンドを解説してみるで詳細なコマンドの比較をすることができます。

  1. Flakes - NixOS Wiki ↩︎

  2. Flakes are such an obviously good thing ↩︎

  3. Draft: 1 year roadmap - NixOS Foundation ↩︎