Nix
エンジニアのためのWebチートシート
Nixは、再現可能なビルドと宣言的なパッケージ管理を実現するツールです。 Nixパッケージマネージャー、Nix言語、Flakes、開発環境構築など、Nixエコシステム全体をチートシートにまとめました。
インストールと設定
インストール
マルチユーザーインストール(推奨)
シングルユーザーインストール
アンインストール
nix.conf 設定
~/.config/nix/nix.conf または /etc/nix/nix.conf に設定を記述します。
チャンネル管理
| コマンド | 説明 |
|---|---|
| nix-channel --add https://nixos.org/channels/nixpkgs-unstable | 安定版チャンネルを追加します。 |
| nix-channel --update | チャンネルを更新します。 |
| nix-channel --list | 登録済みチャンネルを一覧表示します。 |
| nix-channel --remove nixpkgs | チャンネルを削除します。 |
新CLIコマンド(nix)
コア操作
| コマンド | 説明 |
|---|---|
| nix build | パッケージまたはFlakeをビルドします。 |
| nix develop | 開発シェル環境に入ります。 |
| nix run nixpkgs#hello | パッケージのアプリケーションを直接実行します。 |
| nix shell nixpkgs#nodejs nixpkgs#yarn | 一時的にパッケージが利用可能なシェルを起動します。 |
| nix search nixpkgs python | パッケージを名前や説明で検索します。 |
| nix eval nixpkgs#hello.version | Nix式を評価して結果を表示します。 |
| nix repl | 対話的なNix REPLを起動します。 |
| nix fmt | Nixコードをフォーマットします。 |
| nix log nixpkgs#hello | ビルドログを表示します。 |
| nix path-info nixpkgs#hello | ストアパスの情報を表示します。 |
| nix copy --to ssh://server /nix/store/... | ストアパスを別のストアにコピーします。 |
| nix hash path ./my-project | ファイルやディレクトリのハッシュを計算します。 |
プロファイル管理
| コマンド | 説明 |
|---|---|
| nix profile install nixpkgs#ripgrep | パッケージをプロファイルにインストールします。 |
| nix profile remove packages.nixpkgs.ripgrep | パッケージをプロファイルから削除します。 |
| nix profile list | インストール済みパッケージを一覧表示します。 |
| nix profile upgrade '.*' | パッケージを最新版に更新します。 |
| nix profile rollback | プロファイルを前の世代に戻します。 |
レガシーコマンド
nix-env(パッケージ管理)
| コマンド | 説明 |
|---|---|
| nix-env -iA nixpkgs.ripgrep | 属性パスを指定してインストールします。 |
| nix-env -i ripgrep | パッケージを名前でインストールします。 |
| nix-env -q | インストール済みパッケージを一覧表示します。 |
| nix-env -qaP '.*python.*' | 利用可能なパッケージを検索します。 |
| nix-env -e ripgrep | パッケージをアンインストールします。 |
| nix-env -u ripgrep | 特定のパッケージをアップグレードします。 |
| nix-env -u | 全パッケージをアップグレードします。 |
| nix-env --rollback | 前の世代にロールバックします。 |
| nix-env --list-generations | 世代の一覧を表示します。 |
| nix-env --switch-generation 42 | 指定した世代に切り替えます。 |
nix-shell / nix-build / nix-store
| コマンド | 説明 |
|---|---|
| nix-shell | 開発シェルに入ります(shell.nixまたはdefault.nix)。 |
| nix-shell -p nodejs yarn | 一時的にパッケージを利用できるシェルを起動します。 |
| nix-shell --pure | ホスト環境の変数を除外したピュアシェルを起動します。 |
| nix-build | default.nixまたは指定したNix式をビルドします。 |
| nix-build -A hello | 属性パスを指定してビルドします。 |
| nix-instantiate --eval -E '1 + 2' | Nix式を評価してストアパスを出力します。 |
Flakes
flake.nix の基本構造
Flakeの基本的なファイル構造です。
inputs の書き方例
Flakeの依存関係(inputs)の記述パターンです。
Flakeコマンド
| コマンド | 説明 |
|---|---|
| nix flake init | カレントディレクトリにflake.nixテンプレートを生成します。 |
| nix flake init -t templates#rust | テンプレートを指定してFlakeを初期化します。 |
| nix flake update | 全入力の依存関係を最新版に更新します。 |
| nix flake lock --update-input nixpkgs | 特定の入力のみを更新します。 |
| nix flake show | Flakeが提供する出力を表示します。 |
| nix flake check | Flakeの出力を検証します。 |
| nix flake metadata | Flakeのメタデータ(入力、リビジョン等)を表示します。 |
Nix言語基礎
データ型とリテラル
Nix言語の基本的な型とリテラルの書き方です。
関数定義
Nix言語の関数(ラムダ式)の定義パターンです。
キーワード・構文
| キーワード | 説明 | 例 |
|---|---|---|
| let ... in | ローカル変数を定義します。 | let x = 1; y = 2; in x + y |
| with | 属性セットのスコープを展開します。 | with pkgs; [ nodejs yarn ] |
| inherit | 外部スコープから属性を継承します。 | { inherit name; } = { name = src.name; } |
| if / then / else | 条件分岐(全ての分岐が値を返す式)。 | if x > 0 then "pos" else "neg" |
| import | 別のNixファイルを読み込みます。 | import ./config.nix |
| rec | 再帰的属性セット(属性間で相互参照可能)。 | rec { x = 1; y = x + 1; } |
| assert | 条件を検証し、偽の場合はエラーにします。 | assert x > 0; x |
| or(デフォルト値) | 属性が存在しない場合のデフォルト値を指定します。 | attrs.name or "default" |
開発環境
shell.nix(レガシー)
従来のshell.nixを使った開発環境の定義です。
devShells(Flakes)
Flakeを使った開発環境の定義です。
direnv 連携
direnvを使ってディレクトリに入ると自動で環境をロードします。
Nixストア & ガベージコレクション
Nixストアの構造
Nixの全パッケージは/nix/store配下にハッシュ付きパスで格納されます。
ガベージコレクション & ストア管理
| コマンド | 説明 |
|---|---|
| nix-collect-garbage | 不要なストアパスを削除します。 |
| nix-collect-garbage -d | 古い世代を全て削除してからGCを実行します。 |
| nix store gc | Nixストアのガベージコレクションを実行します。 |
| nix store optimise | 重複ファイルをハードリンクでまとめてディスク使用量を削減します。 |
| nix-store -q --references /nix/store/... | 指定したストアパスの依存関係を表示します。 |
| nix-store -q --tree /nix/store/... | 依存関係をツリー形式で表示します。 |
| nix store delete /nix/store/... | 指定したストアパスを削除します。 |
エコシステム
主要ツール・プロジェクト
| ツール | 説明 |
|---|---|
| Nixpkgs | 100,000以上のパッケージを含むNix公式パッケージリポジトリ。 |
| NixOS | Nixパッケージマネージャーを基盤とした宣言的Linux ディストリビューション。 |
| Home Manager | ホームディレクトリの設定(dotfiles等)をNixで宣言的に管理するツール。 |
| nix-direnv | direnvとNixの統合。開発環境の自動ロードとGCルート登録を行います。 |
| devenv | Cachix提供の開発環境フレームワーク。簡潔な設定で再現可能な環境を構築します。 |
| Cachix | Nixバイナリキャッシュサービス。ビルド済みパッケージを共有・再利用できます。 |
| nix-darwin | macOSのシステム設定をNixで宣言的に管理するツール(NixOSのmacOS版)。 |
| flake-utils | Flakeのボイラープレートを削減するユーティリティライブラリ。 |