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.nix
やflake.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
など)に統合されているため、より直感的なコマンド体系になっています。