如何使用nix-env --set命令且不丢失nix-env的访问权限?
解决
nix-env --set后丢失Nix命令的问题 核心原因
nix-env --set会完全替换你的用户profile,如果指定的derivation里没包含nix包,profile的PATH里就不会有Nix工具链的bin目录,自然找不到nix-env、nix这些命令。
可行解决方案
1. 让你的derivation包含nix包
直接把nix包加入到derivation的依赖中,这样替换profile后Nix命令会保留。比如你的derivation配置可以这么写:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkDerivation { name = "my-custom-env"; # 用propagatedBuildInputs确保依赖的bin目录被加入PATH propagatedBuildInputs = [ pkgs.nix ]; # 其他自定义配置... }
构建这个derivation后再执行nix-env --set <derivation-name>,就不会丢失Nix命令了。
2. 改用nix-env --install代替--set
如果不需要完全替换现有profile,只是想添加自定义derivation的内容,用nix-env --install <derivation-name>就不会影响已有的Nix命令,因为它是往profile里追加内容而不是替换。
3. 临时恢复后修正derivation
如果已经出现命令丢失的情况,可以用Nix的绝对路径临时执行命令:
# 先找到nix包的store路径,比如通过ls /nix/store | grep nix- /nix/store/xxxxxx-nix-2.18.1/bin/nix-env --install nix
之后再修改你的derivation加入nix包,重新构建并执行--set即可。
内容的提问来源于stack exchange,提问作者James Flight
相关产品推荐
相关产品推荐

