💭

続、flake.nixで Hello, World!! - inputs編

2023/03/10に公開

以下の続編。outputsを使ったので、前回書いたflex.nixを使ってinputsを使ってみる。
https://zenn.dev/eiel/articles/538954db7a7f1c

nix flakeのinputsを使ってみよう。inputsにはflake.nixを置いてあるディレクトリや含んでいるリポジトリ、アーカイブなどを指定することができる。
ということで、前回書いたflake.nixをhelloディレクトリへ移動して参照してみる。

  • 前回書いたflake.nixhello/flake.nix へ移動
  • 新規にflake.nixを用意し、hello/flake.nixを読み込んで使う

こういう感じである。

$ tree
.
├── flake.nix
└── hello
    └── flake.nix   <-- 前回作ったやつ

hello/flake.nixの中身はこんな感じ。

{
  description = "hello";

  outputs = { self }: {
    hello = "hello, world";
    value = 1;
  };
}

flake.nixはこんな感じ。

{
  description = "hello2";

  inputs = {
    hello.url = "./hello";
  };

  outputs = { self, hello }: {
    result = hello.hello;
  };
}

ポイントはinputs.hello.url"./hello"とディレクトリを指定しているところである。
ここに書いたものがoutputs関数の引数helloに入ってくる。この名前はなんでもよくhelloである必要はない。具体的には goro.url = "./hello"; と書けば outputs = { self, goro }: {となる。
goroにはhello/flake.nixのoutputs関数に引数を適用した場合の値が入ってくる。

nix evalで取り出してみる。

$ nix eval .#result
"hello, world"

まとめ

  • inputsにはflakeが指定できる
  • inputsに指定したflakeは依存先のoutputsが評価され、結果が自分のoutputsの引数に届く

Discussion