Open5

読者コミュニティ|nixos入門: wslで使うnixos (Linux初心者のための究極なOS)

rilril

最初から24.11でやったのですが、chapter9-11のflakesの導入でつまづきました。
chapter9のflake.nixでもchapter11のflake.nixでも以下のようなエラーがでます。
なお、/etc/nixos/以下はgitでは管理していません。

[nixos@nixos:/etc/nixos]$ sudo nixos-rebuild switch
error:
       … while calling the 'seq' builtin
         at /nix/store/y4v9q44b718p1b5rzf0njb0c7gm9xp45-source/lib/modules.nix:359:18:
          358|         options = checked options;
          359|         config = checked (removeAttrs config [ "_module" ]);
             |                  ^
          360|         _module = checked (config._module);while evaluating a branch condition
         at /nix/store/y4v9q44b718p1b5rzf0njb0c7gm9xp45-source/lib/modules.nix:294:9:
          293|       checkUnmatched =
          294|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [ ] then
             |         ^
          295|           let

       (stack trace truncated; use '--show-trace' to show the full, detailed trace)

       error: cannot look up '<nixos-wsl/modules>' in pure evaluation mode (use '--impure' to override)

なお、--impureをつけると以下のように最後だけ変わります。

[nixos@nixos:/etc/nixos]$ sudo nixos-rebuild switch --impure
error:
       … while calling the 'seq' builtin
         at /nix/store/y4v9q44b718p1b5rzf0njb0c7gm9xp45-source/lib/modules.nix:359:18:
          358|         options = checked options;
          359|         config = checked (removeAttrs config [ "_module" ]);
             |                  ^
          360|         _module = checked (config._module);while evaluating a branch condition
         at /nix/store/y4v9q44b718p1b5rzf0njb0c7gm9xp45-source/lib/modules.nix:294:9:
          293|       checkUnmatched =
          294|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [ ] then
             |         ^
          295|           let

       (stack trace truncated; use '--show-trace' to show the full, detailed trace)

       error: The option `wsl.wslConf' in `/nix/var/nix/profiles/per-user/root/channels/nixos-wsl/modules/wsl-conf.nix' is already declared in `/nix/store/26hhqjf62hlazdwskl46ni9f80lkzw7s-source/modules/wsl-conf.nix'.
tositadatositada

<...>syntaxについて

https://nix.dev/guides/best-practices.html#lookup-paths

flakesとmodule内で別のnixos-wslを呼び出しているので
module内 configration.nixで呼び出していると思われる <nixos-wsl/modules>を削除してみてください。

imports = [
    # include NixOS-WSL modules
    <nixos-wsl/modules>
  ];

変更していないことに気きましたので修正しておきます。
ありがとうございます。

rilril

ありがとうございます。無事完走できました。エラーメッセージが" is already declared"だったのでどこかが被っているのだろうということまでしかわかりませんでした。

tositadatositada

rilさんが普段プログラミング言語を使用されているかどうかは分かりませんが。

nix言語の関数,変数?は以下のような形でよく作成されます。
関数名 = 引数: 処理内容 ;

なのでflakes.nixを確認すると、
flakes.nix内のoutputsという関数で引数{nixpkgs,nix-wsl}を受け取ってその先の何かしらの処理を行うという形になります。
最初のエラーcannot look up '<nixos-wsl/modules>に関して
modleの先にあるimportsのモジュールと、同名の引数があった場合には、引数の方が優先されるため、<nixos-wsl/modules>が呼び出せない。といったエラーになります。

impureについては自分もあまり理解できていないので言及はやめておきます。

<nixos-wsl/modules>はnix-channelという機能から呼び出されています。<...>はnix-channelから呼び出されているという認識でいいと思います。
nix-channelはflakesができる前に使用されていたパッケージマネージャーです。
グローバルでパッケージをインストールし、パッケージのバージョンまではコントロールできません。
flakesでは、flakes.lockファイルにあるようにgitを参照して、コミットハッシュ、ブランチを限定してパッケージのバージョンを固定します。
flake.lockを確認して、revに書かれているコミットハッシュがgithub上に存在することを確認できると思います。