You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:32:04