nix pkgs のソースコードを探索する - pkgs.bats.passthru.withLibraries - 無名関数、callPackages を学ぶ

814 Views

January 20, 26

スライド概要

Nix 日本語コミュニティゼミ 資料
2026/1/20

profile-image

社内SE 仕事:Python/Snowflake/Azure 趣味:C#/Docker/Nix

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

nix pkgs のソースコードを探索する pkgs.bats.passthru.withLibraries 無名関数、callPackages を学ぶ ryu 2026/1/20 Nix 日本語コミュニティゼミ

2.

Nix 日本語コミュニティゼミ 自己紹介: ryu バックグラウンド: 非 IT 系企業の社内 SE エンジニア歴 2 年 Nix が好き GitHub: ryuryu333 Zenn: trifolium 2026/1/20 ryu(@ryu_trifolium) 2

3.

Nix 日本語コミュニティゼミ ~前回までのあらすじ~ 2026/1/20 ryu(@ryu_trifolium) 3

4.

Nix 日本語コミュニティゼミ ことの始まり Bash シェルスクリプト のテストツール Bats を導入した ヘルパーライブラリ bats-assert 等だけ見つからない! 2026/1/20 ryu(@ryu_trifolium) 4

5.

Nix 日本語コミュニティゼミ pkgs.Bats のソースコードを見てみる bats-assert を利用しているコードを発見 passthru.tests = { # ... bats.withLibraries (p: [ p.bats-support p.bats-assert p.bats-file p.bats-detik ]) # ... 2026/1/20 ryu(@ryu_trifolium) 5

6.

Nix 日本語コミュニティゼミ 使い方を真似てみる ビルドが通った! シェルスクリプトで load bats-asset も出来た devShells.default = pkgs.mkShell { packages = with pkgs; [ (bats.withLibraries (p: [ p.bats-assert p.bats-support ])) ]; }; 2026/1/20 ryu(@ryu_trifolium) 6

7.

Nix 日本語コミュニティゼミ めでたしめでたし? 2026/1/20 ryu(@ryu_trifolium) 7

8.

Nix 日本語コミュニティゼミ なんでこれで動くのか気になりますよね? →ソースコードを読んでみる リンク:nixpkgs/pkgs/by-name/ba/bats/package.nix 2026/1/20 ryu(@ryu_trifolium) 8

9.
[beta]
Nix 日本語コミュニティゼミ

bats.withLibraries を探す
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"
'';
};

2026/1/20 ryu(@ryu_trifolium)

9

10.

Nix 日本語コミュニティゼミ 前回勉強した内容 passthru 関数を定義できる( , ...) symlinkJoin 複数の derivation を一つの derivation に配置 wrapProgram ラッパー経由でコマンドを実行( → ) bats / bats-assert を同じフォルダに配置し、ラッパー内で を定義する仕組みを、 で定義 passthru.tests passthru.updateScript bats BATS_LIB_PATH 2026/1/20 ryu(@ryu_trifolium) .bats-wrapped passthru.withLibraries 10

11.

Nix 日本語コミュニティゼミ 今日話すこと の仕組みは分かった! どうやって使えばいい? passthru.withLibraries 2026/1/20 ryu(@ryu_trifolium) 11

12.

Nix 日本語コミュニティゼミ 今日話すこと 使用例からコピペすればヨシッ! ↓ passthru.withLibraries 2026/1/20 ryu(@ryu_trifolium) の定義から導いていきます 12

13.

Nix 日本語コミュニティゼミ Nix における関数 関数名> = <引数>: <式> で定義 <関数名> <引数> で利用 < nix-repl> double = x: x*2 nix-repl> double 3 6 参考資料: Nix Pills ch5: Functions and Imports 2026/1/20 ryu(@ryu_trifolium) 13

14.

Nix 日本語コミュニティゼミ 関数 withLibraries selector が引数 symlinkJoin { ... } の引数と式 が式(呼び出し時の返り値) passthru.withLibraries = selector: symlinkJoin { # ... } 2026/1/20 ryu(@ryu_trifolium) 14

15.

Nix 日本語コミュニティゼミ 引数 selector は を引数として受け取っている → 関数として利用されている selector bats.libraries symlinkJoin { # ... paths = [ bats ] ++ selector bats.libraries; # ... 2026/1/20 ryu(@ryu_trifolium) 15

16.

Nix 日本語コミュニティゼミ bats.libraries とは? passthru.libraries で定義された関数 (正確には引数が無いので、値(Attribute Set)を参照してるだけ と言った方がいいかも) passthru.libraries = callPackages ./libraries.nix { }; callPackages に ./libraries.nix { } 2026/1/20 ryu(@ryu_trifolium) を渡した結果が返される 16

17.
[beta]
Nix 日本語コミュニティゼミ

libraries.nix

引数に 等を受け取る
返り値は
や
lib

bats-assert

bats-support

のデリベーションの集合体

{ lib, stdenv, fetchFromGitHub, }:
{
bats-assert = stdenv.mkDerivation (finalAttrs: {
pname = "bats-assert";
version = "2.1.0";
src = fetchFromGitHub {
# ...
bats-support = stdenv.mkDerivation (finalAttrs: {
# ...

2026/1/20 ryu(@ryu_trifolium)

17

18.

Nix 日本語コミュニティゼミ callPackages とは の便利版(大雑把なイメージ) 等の引数を自動で渡してくれる import lib import ./libraries.nix { inherit lib stdenv fetchFromGitHub; }; callPackages ./libraries.nix { }; 2026/1/20 ryu(@ryu_trifolium) 18

19.
[beta]
Nix 日本語コミュニティゼミ

callPackages と import
の
にて callPackages を import に置き換える
当然のごとくエラー発生
pkgs/by-name/ba/bats/package.nix

passthru.libraries

# passthru.libraries = callPackages ./libraries.nix { };
passthru.libraries = import ./libraries.nix { };
$ nix-build -E 'with import ./. {}; bats.withLibraries (p: [ p.bats-support p.bats-assert ])'
# error...
error: function 'anonymous lambda' called without required argument 'lib'

2026/1/20 ryu(@ryu_trifolium)

19

20.
[beta]
Nix 日本語コミュニティゼミ

callPackages と import

import で書く場合、引数を手動で指定しれば動く
# passthru.libraries = callPackages ./libraries.nix { };
passthru.libraries = import ./libraries.nix {
inherit lib stdenv fetchFromGitHub;
};
$ nix-build -E 'with import ./. {}; bats.withLibraries (p: [ p.bats-support p.bats-assert ])'
/nix/store/biv81q03l5jwip9nqb16hf44isziibdq-bats-with-libraries-1.12.0

callPackages だと書くのが楽!
2026/1/20 ryu(@ryu_trifolium)

20

21.

Nix 日本語コミュニティゼミ 関数 selector を引数として受け取っている は 等のデリベーション (=各ツールのビルド手順をまとめたもの) selector は の引数 bats.libraries bats.libraries bats-assert symlinkJoin { paths = [ bats ] ++ selector bats.libraries; 2026/1/20 ryu(@ryu_trifolium) 21

22.

Nix 日本語コミュニティゼミ 関数 selector の返り値 リストと結合 されるので、リストが返り値 → 等のデリベーションのリストが返り値 [] ++ bats-assert symlinkJoin { paths = [ bats ] ++ selector bats.libraries; 2026/1/20 ryu(@ryu_trifolium) 22

23.

Nix 日本語コミュニティゼミ 関数 withLibraries selector 引数: 返り値: が引数 の引数と返り値 等のデリベーションの集合体 等のデリベーションのリスト が返り値 と 等のデリベーションを 一つのデリベーションにまとめたモノ bats-assert bats-assert symlinkJoin { ... } bats bats-assert passthru.withLibraries = selector: symlinkJoin { ... } 2026/1/20 ryu(@ryu_trifolium) 23

24.

Nix 日本語コミュニティゼミ 呼び出し方を考える の引数は関数 無名関数を作成して渡す withLibraries 2026/1/20 ryu(@ryu_trifolium) 24

25.

Nix 日本語コミュニティゼミ Nix における無名関数 関数>) と定義 ※ <関数名> = <引数>: <式> が通常の関数 (<引数>: <式>) <引数> と利用 (< nix-repl> double = x: x*2 nix-repl> double 3 6 nix-repl> (x: x*2) 3 6 2026/1/20 ryu(@ryu_trifolium) 25

26.

Nix 日本語コミュニティゼミ 呼び出し方を考える withLibraries 引数: 返り値: の引数は関数( ) (デリベーションの集合体) 等のデリベーションのリスト selector bats.libraries bats-assert (bats.libraries: [ bats.libraries.bats-assert ]) bats.libraries を に置き換える p (p: [ p.bats-assert ]) 2026/1/20 ryu(@ryu_trifolium) 26

27.

Nix 日本語コミュニティゼミ 無事に利用例と同じ形が導けました 2026/1/20 ryu(@ryu_trifolium) 27

28.

Nix 日本語コミュニティゼミ 今日の話は忘れても大丈夫です (ドキュメントに利用例を足しました) 2026/1/20 ryu(@ryu_trifolium) 28

29.

Nix 日本語コミュニティゼミ 終わり? 2026/1/20 ryu(@ryu_trifolium) 29

30.

Nix 日本語コミュニティゼミ callPackages の定義が未確認 → ソースコートを読んでいきます 2026/1/20 ryu(@ryu_trifolium) 30

31.

Nix 日本語コミュニティゼミ callPackages とは の便利版(大雑把なイメージ) 等の引数を自動で渡してくれる import lib import ./libraries.nix { inherit lib stdenv fetchFromGitHub; }; callPackages ./libraries.nix { }; 2026/1/20 ryu(@ryu_trifolium) 31

32.

Nix 日本語コミュニティゼミ callPackages の定義 nixpkgs/pkgs/top-level/splice.nix に記述がある pkgs + pkgs.xorg の集合体を に渡している lib.callPackagesWith packagesWithXorg = pkgs // removeAttrs pkgs.xorg [ "callPackage" "newScope" "overrideScope" "packages" ]; pkgsForCall = if actuallySplice then splicedPackagesWithXorg else packagesWithXorg; callPackages = lib.callPackagesWith pkgsForCall; 2026/1/20 ryu(@ryu_trifolium) 32

33.

Nix 日本語コミュニティゼミ callPackagesWith の定義 nixpkgs/lib/customisation.nix に記述がある 引数を 3 つ必要とする関数として定義されている(詳細は後述) callPackageWith = autoArgs: fn: args: let f = if isFunction fn then fn else import fn; fargs = functionArgs f; allArgs = intersectAttrs fargs autoArgs // args; in makeOverridable f allArgs 2026/1/20 ryu(@ryu_trifolium) 33

34.

Nix 日本語コミュニティゼミ 呼び出しの整理 callPackages → ※ → 定義は に渡したのは ./libraries.nix { } callPackages = lib.callPackagesWith pkgsForCall lib.callPackagesWith pkgsForCall ./libraries.nix { } 定義は lib.callPackageWith autoArgs: fn: args: autoArgs pkgsForCall = 、 = は pkgs + pkgs.xorg の集合体 pkgsForCall 2026/1/20 ryu(@ryu_trifolium) fn ./libraries.nix 、 args = { } 34

35.

Nix 日本語コミュニティゼミ callPackagesWith autoArgs = pkgsForCall 、 = fn ./libraries.nix 、 args = { } f = if isFunction fn then fn else import fn; fargs = functionArgs f; allArgs = intersectAttrs fargs autoArgs // args; ※ マスク用セット> <データ元セット> フィルター処理 intersectAttrs < (= pkgs + pkgs.xorg)から だけを絞り込んだ後、 をマージ autoArgs args 2026/1/20 ryu(@ryu_trifolium) fn の引数( fargs ) 35

36.

Nix 日本語コミュニティゼミ callPackagesWith autoArgs = pkgsForCall 、 = fn ./libraries.nix 、 args = { } f = if isFunction fn then fn else import fn; allArgs = intersectAttrs fargs autoArgs // args; makeOverridable f allArgs fn の引数の集合体である 2026/1/20 ryu(@ryu_trifolium) allArgs を (= )に渡す f fn 36

37.

Nix 日本語コミュニティゼミ Callpackage Design Pattern これまでの話はこちらのチュートリアルに書かれている Callpackage Design Pattern をより実践で使っている例と言えそう 参考資料: Nix Pills ch13: Callpackage Design Pattern 2026/1/20 ryu(@ryu_trifolium) 37

38.

Nix 日本語コミュニティゼミ ご清聴ありがとうございました 2026/1/20 ryu(@ryu_trifolium) 38