如何使用 nix 在堆栈中传递自定义环境变量(如密码)?
How to pass customize environment variable (like password) in stack with nix?
我在 nix 中使用堆栈。我需要将环境变量作为数据库密码传递,以便在运行时连接到 Postgres。目前,我在 YAML 中启用了 nix 并自定义了我自己的 .nix
以将密码放入 .nix
.
stack.yaml:
nix:
enable: true
pure: true
shell-file: shell.nix
shell.nix:
{ghc}:
with (import <nixpkgs> {});
haskell.lib.buildStackProject {
inherit ghc;
name = "myenv";
buildInputs = [ postgresql_10 ];
PGPASSWORD = "pw";
}
但是当我想将代码提交到 GitHub/Gitlab 并转到 CI/CD 管道时,在 .nix
中显式输入密码似乎不太好。请问有什么好的方法可以解决这个问题吗?
您可以在 Nix 表达式中使用 builtins.getEnv
函数从外部环境获取环境变量的值,因此您可以这样做:
PGPASSWORD = builtins.getEnv "PGPASSWORD";
这只是设置其值的一种方式。您还可以使用 import
导入您从未提交给 git 的 Nix 表达式文件,或者您可以使用 builtins.readFile
读取您从未提交给 git 的文件。
我在 nix 中使用堆栈。我需要将环境变量作为数据库密码传递,以便在运行时连接到 Postgres。目前,我在 YAML 中启用了 nix 并自定义了我自己的 .nix
以将密码放入 .nix
.
stack.yaml:
nix:
enable: true
pure: true
shell-file: shell.nix
shell.nix:
{ghc}:
with (import <nixpkgs> {});
haskell.lib.buildStackProject {
inherit ghc;
name = "myenv";
buildInputs = [ postgresql_10 ];
PGPASSWORD = "pw";
}
但是当我想将代码提交到 GitHub/Gitlab 并转到 CI/CD 管道时,在 .nix
中显式输入密码似乎不太好。请问有什么好的方法可以解决这个问题吗?
您可以在 Nix 表达式中使用 builtins.getEnv
函数从外部环境获取环境变量的值,因此您可以这样做:
PGPASSWORD = builtins.getEnv "PGPASSWORD";
这只是设置其值的一种方式。您还可以使用 import
导入您从未提交给 git 的 Nix 表达式文件,或者您可以使用 builtins.readFile
读取您从未提交给 git 的文件。