在 NIX buildInputs 中使用变量?

问题描述 投票:0回答:1

我有一个

shell.nix
配置,从变量中检索
pkgs
,如下所示:

{ pkgs ? import <nixpkgs> { } }:
with pkgs;
let
  nodeJs = "pkgs.nodejs_${builtins.getEnv "NODE_VERSION"}";
  terraform = pkgs.writers.writeBashBin "terraform" ''
    ${pkgs.terraform}/bin/terraform "$@"
  '';
in
pkgs.mkShell {
  buildInputs = [
    nodeJs 
    terraform
    pkgs.ngrok
  ];

}

但是当我跑步时

nix shell
我得到:

构建输入 pkgs.nodejs_20 不存在

但是,如果我要像这样直接运行它(没有变量):

{ pkgs ? import <nixpkgs> { } }:
with pkgs;
pkgs.mkShell {
  buildInputs = [
    nodejs_20
    terraform
    pkgs.ngrok
  ];
}

这会很好用。我认为它被解释为字符串。我无法找到一种方法可以将此变量写为字符串以外的任何内容而不引发语法错误。

我该如何解决这个问题,是否可以根据环境变量安装

pkgs

nix nix-shell
1个回答
0
投票

"pkgs.nodejs_${builtins.getEnv "NODE_VERSION"}"
是一个 string,因此并不指代包。要创建对包的动态引用,您可以执行以下操作
pkgs.${"nodejs_" + builtins.getEnv "NODE_VERSION"}
:

❯ NODE_VERSION=20 nix repl --file '<nixpkgs/nixos>'
Welcome to Nix 2.18.7. Type :? for help.

Loading installable ''...
Added 6 variables.
nix-repl> pkgs.${"nodejs_" + builtins.getEnv "NODE_VERSION"}
«derivation /nix/store/3hxn26fh3cpz4rnx3lcwm5cb0vg15rzk-nodejs-20.17.0.drv»
© www.soinside.com 2019 - 2024. All rights reserved.