如何在Nix Shell中添加其他派生的bin目录至PATH?
解决方法:使用
mkShell自动配置PATH 要让nix-shell的环境自动包含目标派生的bin/目录,最简洁的方式是使用Nixpkgs提供的mkShell函数——它专门用于构建交互式shell环境,会自动处理依赖的PATH配置。
修改后的foo.nix代码
let # 导入Nixpkgs集合,用于获取mkShell工具 pkgs = import <nixpkgs> {}; # 拉取你的haskell-script仓库 git = builtins.fetchGit { url = https://github.com/ingun37/haskell-script.git; rev = "e96ac79d6bf338c98697bb4ba510f22cb5f502ac"; }; # 导入派生定义 haskellScriptD = import git {}; in # 使用mkShell创建shell环境,将目标派生加入buildInputs pkgs.mkShell { buildInputs = [ haskellScriptD ]; }
为什么这样能生效?
mkShell的buildInputs参数会自动触发Nixpkgs的标准钩子,把每个依赖派生的bin/目录添加到PATH环境变量中。这样当你执行nix-shell foo.nix进入沙箱后,直接输入json-generator就能运行对应的可执行文件,不需要手动指定路径。
验证命令
直接执行以下命令即可测试:
nix-shell foo.nix --run json-generator
备选方案:手动配置PATH(如果需要更灵活的控制)
如果因为某些原因不想用mkShell,也可以通过shellHook手动设置PATH:
let pkgs = import <nixpkgs> {}; git = builtins.fetchGit { url = https://github.com/ingun37/haskell-script.git; rev = "e96ac79d6bf338c98697bb4ba510f22cb5f502ac"; }; haskellScriptD = import git {}; in pkgs.mkShell { shellHook = '' # 手动将目标派生的bin目录追加到PATH最前面 export PATH="${haskellScriptD}/bin:$PATH" ''; }
你原来的代码问题所在
你之前创建的是一个普通的derivation,它的设计目的是构建输出产物,而非配置交互式shell环境。这类派生不会自动处理依赖的PATH注入,因此你必须手动指定完整路径才能运行命令。
内容的提问来源于stack exchange,提问作者Ingun전인건
相关产品推荐
相关产品推荐

