Chapter 10

第2部: 実践Nix

この章では、ビルド以外のNixの実用的な使い方について学びます。

  • Nix CLIの基本
  • devShellによる宣言的な開発環境構築
  • Profileによるグローバルインストール

【余談】従来のコマンド体系とNix channels

従来のNixは、Nix言語の依存関係をNix channelsという機能で管理していました。ChannelsはプロジェクトをChannelという単位で扱います。FlakesがFlakeごとにローカルな依存関係管理を行うのに対し、Channelsはグローバルな管理を行います。また、バージョンロック機構がなく、apt updateのようにユーザーが手動でグローバルのchannelをアップデートします。

管理方式 プロジェクト単位 管理の範囲 バージョンロック
Flakes Flake ローカル あり
Channels Channel グローバル なし

Channelsは再現性の面で大きな問題があります。flake.nixflake.lockといった定義ファイルが存在せず、依存関係が暗黙的に管理されるため、マシンによってchannelの構成やバージョンに差異が生じてしまうからです。

この問題の解決策として提案されたのがFlakesです。ChannelsがOSのパッケージマネージャと似た仕組みだったのに対し、Flakesは現代的なプログラミング言語のパッケージマネージャに近い仕組みになっています。

また、Flakesに合わせてNix commandという新たなコマンド体系も導入されました。従来のコマンドはChannelsを用いてNix言語を評価していましたが、Nix commandはFlakesをベースにしています。また、従来のコマンド体系が用途ごとに別々のコマンド(nix-build/nix-storeなど)に分かれていたのに対し、Nix commandは全てnixのサブコマンド(nix build/nix storeなど)に統合されているため、より直感的なコマンド体系になっています。