プラットフォーム

Nixpkgsとは?Nixとの関係・パッケージの探し方とinstall・flake.nixでの使い方

Nixpkgsとは?Nixとの関係・パッケージの探し方とinstall・flake.nixでの使い方

Nixpkgsは、パッケージマネージャ「Nix」で使うパッケージ定義を集めたリポジトリです。GitHubの NixOS/nixpkgs で開発されており、Linux ディストリビューション NixOS もここから組み立てられます。この記事では2026年9月時点のNix 2.35系とNixOS 26.05を前提に、Nix・NixOSとの違い、パッケージの探し方と入れ方、shell.nix・flake.nixでのバージョン固定を順に整理します。最後に、Nixpkgsの関数 symlinkJoin と wrapProgram を使う例として、Bashのテストツール Bats に拡張ライブラリを組み込む手順を示します。Batsのテストは実際に実行し、Nix式は構文解析で確かめたコードです。

まとめ:Nixpkgsの要点

  • Nixpkgsとは:Nix言語で書かれたパッケージ定義(レシピ)の集まり。公式検索 search.nixos.org は「140,000を超えるパッケージ」を検索対象としている(2026年9月26日時点)。NixOSの設定モジュールも同じリポジトリに入っている。
  • Nix・NixOSとの違い:Nixはレシピを評価してビルドするツール、Nixpkgsはレシピ集、NixOSはNixpkgsで組み立てるLinuxディストリビューション。NixとNixpkgsだけならmacOSや既存のLinuxでも使える。
  • 探し方:ブラウザなら search.nixos.org、端末なら nix search nixpkgs 名前。
  • 入れ方:試すだけなら nix-shell -p か nix shell。常用するなら nix profile add(Nix 2.30で nix profile install から改名)。
  • 固定の仕方:プロジェクトごとの開発環境は flake.nix に書き、Nixpkgsのコミットを flake.lock に固定する。<nixpkgs> を参照する shell.nix はマシンごとに中身が変わる。

Nixpkgsとは:Nix・NixOSとの関係

名前が似ているため混同されやすいのですが、3つは役割がはっきり分かれています。

名称 正体 2026年9月時点の版 単体で使えるか
Nix パッケージマネージャ本体(ビルドツール) 2.35.2 使える(Linux・macOS)
Nixpkgs パッケージ定義とNixOSモジュールを集めたリポジトリ ブランチ単位で更新(安定版は26.05) Nixが必要
NixOS Nixpkgsから組み立てるLinuxディストリビューション 26.05 OSとしてインストール

Nixpkgsの中身は、ソフトウェアごとに「どのソースを取ってきて、何に依存し、どうビルドするか」を書いたNix式のファイルです。Nixはこれを評価して、ビルド手順(derivation)に変換し、実行します。つまりNixpkgsは実行ファイルの置き場ではなく、レシピの置き場です。

ドキュメントやコードで見かける pkgs は、Nixpkgsを読み込んだ結果の属性セット(パッケージの一覧)に慣例で付ける名前です。pkgs.ripgrep と書けば、Nixpkgsに入っている ripgrep のパッケージを指します。

Nixpkgsの仕組み:/nix/storeとブランチ

/nix/storeとハッシュ付きのパス

Nixがビルドしたものは、すべて /nix/store/<ハッシュ>-ripgrep-<バージョン> のような読み取り専用のディレクトリに入ります。通常のパッケージでは、ハッシュはソースや依存パッケージ、ビルド手順といった入力から計算されるため、入力が1つでも違えば別のパスになります(ソースのダウンロードのように、出力の中身のハッシュで決まる固定出力derivationは例外です)。同じソフトの別バージョンが衝突せずに共存でき、前の状態へ戻す(ロールバックする)のも、参照先を切り替えるだけで済みます。

実際には毎回ソースからビルドするわけではありません。公式のビルドサーバー Hydra がビルドした結果が cache.nixos.org にあり、同じハッシュのものがあればそれをダウンロードします。

ブランチとチャネル

Nixpkgsは master ブランチで開発され、ビルドとテストを通過したコミットだけが利用者向けのブランチ(チャネル)に進みます。安定版は毎年5月と11月に切られ、2026年9月時点の最新は nixos-26.05 です。

ブランチ 性格 向いている用途
nixos-26.05 安定版。主にセキュリティ修正とバグ修正だけが入る NixOSのサーバー、固定したい開発環境
nixos-unstable ローリング。NixOSのテストを通過したコミットだけが進む NixOSのデスクトップで新しい版を使う
nixpkgs-unstable ローリング。NixOSのテストを待たずに進む macOSや他ディストリでNixだけ使う
master 開発ブランチ。バイナリキャッシュが揃っていないことがある Nixpkgsへの貢献

Nixpkgsのパッケージ検索とインストール

Nixのインストールと実験的機能の有効化

公式サイト nixos.org/download が案内しているコマンドは次のとおりです。Linuxでは、systemdが動いていてSELinuxが無効、かつsudoが使える環境ならマルチユーザーのインストールが推奨されています。macOSは --daemon を付けずに同じスクリプトを実行します。

curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh -s -- --daemon

nix search、nix shell、flake.nix などの新しいコマンドは、Nix 2.35.2でも実験的機能の扱いです。使う前に ~/.config/nix/nix.conf へ次の1行を書いておきます。

experimental-features = nix-command flakes

パッケージ検索と属性名の確認

パッケージ名(属性名)は、ソフトの名前と一致しないことがあります。まず search.nixos.org か、次のコマンドで確認します。

nix search nixpkgs ripgrep

結果に出る legacyPackages.x86_64-linux.ripgrep の末尾(ripgrep)が、以降のコマンドで指定する属性名です。

一時利用と常用のコマンド

用途によってコマンドを使い分けます。

やりたいこと 新しいコマンド 従来のコマンド
そのシェルだけで使う nix shell nixpkgs#ripgrep nix-shell -p ripgrep
1回だけ実行する nix run nixpkgs#hello なし
ユーザー環境に入れる nix profile add nixpkgs#ripgrep nix-env -iA nixpkgs.ripgrep
入れたものを更新する nix profile upgrade --all nix-channel --update のあと nix-env -u
削除する nix profile remove ripgrep nix-env -e ripgrep

nix profile add は、Nix 2.30のリリースノートで nix profile install から改名されました。install も別名として残っているので、古い記事の手順もそのまま動きます。

従来の nix-env を使う場合は、-A(--attr)で属性名を指定します。Nixのマニュアルは、-A を付けたほうがパッケージ名で照合するより速く、指す対象も曖昧にならないと説明しています。-A なしの nix-env -i ripgrep は、同じ名前を持つパッケージ全体から候補を探すためです。

shell.nix・flake.nixによる開発環境の定義

shell.nix(従来の方法)

プロジェクトの直下に次の shell.nix を置いて nix-shell を実行すると、指定したパッケージが入ったシェルに入れます。mkShell は開発用シェルを作るためのNixpkgsの関数です。

{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
  packages = [
    pkgs.jq
    pkgs.shellcheck
  ];
}

ただし <nixpkgs> は NIX_PATH などの検索パスから解決され、通常はそのマシンに登録されたチャネルを指します。チャネルを更新した時期が違えば、同じ shell.nix でも入るバージョンが変わります。チームで同じ環境を共有したいなら、次の flake.nix で固定します。

flake.nixとflake.lockによるコミット固定

{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";

  outputs = { self, nixpkgs }:
    let
      forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
    in
    {
      devShells = forAllSystems (system:
        let pkgs = nixpkgs.legacyPackages.${system};
        in {
          default = pkgs.mkShell {
            packages = [ pkgs.jq pkgs.shellcheck ];
          };
        });
    };
}

nix develop を初めて実行すると、その時点の nixos-26.05 ブランチのコミットが flake.lock に記録されます。flake.nix と flake.lock を一緒にGitへコミットすれば、誰がいつ実行しても同じコミットのNixpkgsが使われます。更新したいときは nix flake update で flake.lock を書き換えます。

flakeは、Gitで管理されているディレクトリではGitに追跡されているファイルしか見えません。flake.nix を作った直後に「Path ‘flake.nix’ in the repository … is not tracked by Git.」と表示されたら、先に git add flake.nix を実行します。

symlinkJoin・wrapProgramの使用例:Batsへの拡張ライブラリ組み込み

Nixpkgsには、パッケージ定義を書くための関数も多数入っています。ここでは symlinkJoin(複数のパッケージを1つのディレクトリにまとめる)と wrapProgram(実行ファイルを、環境変数を設定するラッパーに置き換える)が実際にどう使われているかを、Bashのテストツール Bats で見ます。

Bats(bats-core) は、シェルスクリプトを @test ブロックで検証するテストフレームワークです。アサーション用の bats-assert などは別リポジトリの拡張ライブラリになっていて、Batsは bats_load_library でそれらを読み込むときに環境変数 BATS_LIB_PATH を探します。

bats.withLibraries の中身

Nixpkgsの bats パッケージ(pkgs/by-name/ba/bats/package.nix)には、拡張ライブラリを同梱した bats を作る withLibraries が定義されています。2026年9月時点で、収録されている Bats は nixos-26.05 が1.12.0、nixos-unstable が1.14.0 です。該当部分(masterの定義から meta の行を省略)は次のとおりです。

passthru.withLibraries =
  selector:
  symlinkJoin {
    name = "bats-with-libraries-${bats.version}";

    paths = [
      bats
    ]
    ++ selector bats.libraries;

    nativeBuildInputs = [
      makeWrapper
    ];

    postBuild = ''
      wrapProgram "$out/bin/bats" \
        --suffix BATS_LIB_PATH : "$out/share/bats"
    '';
  };

処理は2段です。まず symlinkJoin が、bats 本体と選んだライブラリ(それぞれ share/bats/bats-assert などに入っている)を1つのディレクトリへシンボリックリンクでまとめます。次に wrapProgram が bin/bats をラッパーに差し替え、BATS_LIB_PATH の末尾にそのディレクトリを足します。Nixpkgsのマニュアルは、--prefix は依存先を固定してしまい、--suffix は実行時の値を優先してその後ろに補う、と使い分けを説明しています。ここで --suffix なのは、利用者が自分で設定した BATS_LIB_PATH を上書きしないためです。

devShellへのbats.withLibrariesの追加

先ほどの flake.nix の packages を次のように書き換えます。p には bats.libraries(bats-assert・bats-support・bats-file・bats-detik)が渡されるので、使うものだけを選びます。

packages = [
  (pkgs.bats.withLibraries (p: [
    p.bats-support
    p.bats-assert
  ]))
];

回文判定スクリプトのテストと実行結果

テスト対象は、引数が回文ならYESを出力して成功し、そうでなければNOを出力して終了コード1を返すスクリプトです。

#!/usr/bin/env bash
input="$1"
reversed="$(printf '%s' "$input" | rev)"
if [ "$input" = "$reversed" ]; then
  echo "YES"
else
  echo "NO"
  exit 1
fi

これを is_palindrome.sh として保存して実行権限を付け、test/is_palindrome.bats に次のテストを書きます。bats-assert は bats-support に依存するので、この順番で読み込みます。テスト名を英数字にしているのは、macOS標準のbash 3.2で実行したとき、UTF-8ロケールでは日本語のテスト名が「unknown test name」となり1件も実行されなかったためです(LC_ALL=C では日本語名でも通りました)。

setup() {
  bats_load_library bats-support
  bats_load_library bats-assert
  cd "$BATS_TEST_DIRNAME/.."
}

@test "palindrome prints YES and succeeds" {
  run ./is_palindrome.sh level
  assert_success
  assert_output "YES"
}

@test "non-palindrome prints NO and fails" {
  run ./is_palindrome.sh hello
  assert_failure
  assert_output "NO"
}

nix develop で入ったシェルから bats test/ を実行します。筆者の環境ではNixを使わず、nixos-26.05 と同じ版(Bats 1.12.0・bats-support 0.3.0・bats-assert 2.1.0)と nixos-unstable と同じ版(Bats 1.14.0・bats-assert 2.2.4)の両方を、withLibraries と同じくライブラリ名のディレクトリに置いて BATS_LIB_PATH を設定し、どちらでも次の結果を確認しました(端末ではなくパイプに出力したため、TAP形式で表示されています)。Nix上での評価とビルドは行っておらず、Nix式は構文のみを確認しています。

1..2
ok 1 palindrome prints YES and succeeds
ok 2 non-palindrome prints NO and fails

同じテストを BATS_LIB_PATH なしで実行すると、両方のテストが setup で止まり、次のメッセージが出ました。withLibraries を使わずに pkgs.bats だけを入れた場合に出るのがこのエラーです。

Could not find library 'bats-support' relative to test file or in BATS_LIB_PATH

Nixpkgs利用時のつまずきと対処

unfreeパッケージの許可設定

Nixpkgsは、ライセンスが自由ソフトウェアでないパッケージ(unfree)を既定では評価しません。検索にも出ません。チャネルなどflakeを使わない環境で常に許可するなら ~/.config/nixpkgs/config.nix に { allowUnfree = true; } と書きます。1回だけなら環境変数 NIXPKGS_ALLOW_UNFREE=1 を使えますが、flakeを使うコマンドは環境変数を読まないため --impure も付けます。flake.nix の中で許可するなら、legacyPackages の代わりに import nixpkgs { inherit system; config.allowUnfree = true; } で pkgs を作ります。

チャネルとflakeの参照先の違い

nix-shell -p や nix-env はチャネル(<nixpkgs>)を、nix shell nixpkgs#… はフレークのレジストリに登録された nixpkgs(既定は nixpkgs-unstable)を参照します。同じマシンでもコマンドによって入るバージョンが違うのはこのためです。プロジェクトでは flake.lock で固定し、手元の常用ツールは nix profile に寄せると混乱が減ります。

macOSのAPFSボリュームとシェル設定

macOSではインストーラが /nix 用のAPFSボリュームを作ります。OSのメジャーアップデート後に nix が見つからなくなった場合は、インストーラが /etc/zshrc などに追記した読み込み行が、残っているかを確認します。Nixを直接触らずに済ませたい場合は、Nixpkgsのパッケージを devbox.json で指定できる Devbox という選択肢もあります。

よくある質問

Nixpkgsとは何ですか?

パッケージマネージャNixで使うパッケージ定義(Nix式)を集めたリポジトリです。GitHubの NixOS/nixpkgs で開発されており、NixOSの設定モジュールも含みます。

NixとNixpkgsとNixOSの違いは何ですか?

Nixはパッケージをビルド・管理するツール、Nixpkgsはそのパッケージ定義の集まり、NixOSはNixpkgsを使って組み立てるLinuxディストリビューションです。NixとNixpkgsはmacOSや他のLinuxでも使えます。

Nixpkgsのパッケージ数はどれくらいですか?

公式のパッケージ検索 search.nixos.org は、2026年9月26日時点で「140,000を超えるパッケージ」を検索対象と表示しています。正確な件数はブランチと時期によって変わります。

Nixpkgsを更新(update)するにはどうすればよいですか?

flakeを使っているなら nix flake update で flake.lock を更新します。nix profile で入れたものは nix profile upgrade --all、チャネルを使っているなら nix-channel --update です。

flake.nixでNixpkgsのURLはどう書きますか?

inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; のように、GitHubのリポジトリとブランチ名を書きます。ローリング版を使うなら末尾を nixos-unstable にします。実際に使われるコミットは flake.lock に記録されます。

関連記事

お気に入りに入れた記事の一覧

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.09.28 テックブログ タイムズカーの不正アクセスと約660万件の流出|免許証画像を退会者まで残さない保管設計
  2. 2026.09.25 コラム 最低賃金引き上げ【令和8年度】47都道府県の改定額・発効日と企業の対応手順
  3. 2025.11.28 コラム ポリコレとは?意味と具体例、「行き過ぎ」「逆差別」と言われる理由を法律と調査で整理
  4. 2026.09.05 コラム 犯罪収益移転防止法の本人確認:2027年4月の対面IC読み取り義務化と改修要件
  5. 2026.07.21 テックブログ Apache Tomcatの脆弱性一覧【2026年9月】15件の修正版9.0.122・10.1.60・11.0.26と影響確認・対応手順

RELATED POSTS 関連記事

目次