🎉
nix-env -u すると名前衝突の警告がでる
経緯
nix-env -u
すると以下の警告がでる。
warning: name collision in input Nix expressions, skipping '/home/xxx/.nix-defexpr/channels_root/nixpkgs'
結論
nixはrootユーザのチャンネル引き継いでおり、ユーザがnixpkgsチャンネルを自ら追加すると複数の同じprefixのチャンネルが登録されている状態になるため、発生する。
解決方法としてはrootユーザのchannelを削除するのが便利だろう。大半の人が自分しか使わないものであるためである。sudo -i
を経由して操作することができるので、上記のエラーではnixpkgsが問題なので、 sudo -i nix-channel --remove nixpkgs
すれば改善される。
もうちょっと詳しく
- macOSで利用する場合nixのマルチユーザモードが利用される
- マルチユーザモードの場合rootユーザのチャンネルを引き継ぐ
- その状態は
~/.nix-defexpr/channels_root
に保持される - この状態のとき
nix-channel --list
を実行したときチャンネル一覧には現れない - このためchannelを登録していないと勘違いして
nix-channel --add
してしまうことでこの問題がおきる。 - ただし、動作してはユーザのチャンネルが優先されると思われるので問題は起きないが警告が出る状態である
- そのため無視しても問題ないが、rootか自分のchannelを削除するのがよいだろう
nixpkgs以外の名前をつけて運用する方法もあるかもしれません
ここから選べる学び
- nix-channelは ~/.nix-defexpr/を管理している
- nix-channelコマンドではrootのchannelの読み取ることはできない
- nix-channelコマンドをrootで使う場合はloginモードになる
sudo -i
を利用すると良い
Discussion