如何在Nix的buildInputs中通过环境变量引用pkgs包?
问题解决:通过环境变量动态选择Nix中的Node.js版本
你的核心问题是把nodeJs定义成了字符串,而Nix的buildInputs需要的是实际的包对象,不是字符串字面量。要动态从pkgs中获取对应版本的Node.js,得用属性查找的方式,而不是拼接字符串。
修正后的配置
{ pkgs ? import <nixpkgs> { } }: with pkgs; let # 获取环境变量NODE_VERSION,可选加默认值避免未设置时报错 nodeVersion = builtins.getEnv "NODE_VERSION" or "20"; # 动态从pkgs中取出对应版本的Node.js包 nodeJs = builtins.getAttr "nodejs_${nodeVersion}" pkgs; terraform = pkgs.writers.writeBashBin "terraform" '' ${pkgs.terraform}/bin/terraform "$@" ''; in pkgs.mkShell { buildInputs = [ nodeJs terraform pkgs.ngrok ]; }
关键说明
builtins.getAttr是Nix内置函数,用于从属性集(比如pkgs)中根据属性名动态取值,正好满足你通过环境变量拼接属性名的需求。- 加上
or "20"是为了容错:如果未设置NODE_VERSION环境变量,会默认使用Node.js 20版本,避免直接报错。
使用方式
运行时只需先设置环境变量再执行nix shell:
export NODE_VERSION=20 nix shell
或者一次性执行:
NODE_VERSION=20 nix shell
内容的提问来源于stack exchange,提问作者Chris Rogers
相关产品推荐
相关产品推荐

