我有一个
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
?
"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»