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 に記録されます。