如何将环境变量传递给通过堆栈运行的 Haskell 程序?

chr*_*gue 5 haskell environment-variables nixos haskell-stack

我只是注意到通过运行的 Haskell 程序stack不会从调用环境接收环境变量。这是一个示例程序:

-- testenv.hs
import System.Environment
main :: IO ()
main = print =<< getEnv "FOOBAR"
Run Code Online (Sandbox Code Playgroud)

如果我在没有堆栈的情况下运行它,就像这样,它可以工作:

% FOOBAR=123 runhaskell testenv.hs
"123"
Run Code Online (Sandbox Code Playgroud)

但是使用堆栈:

% FOOBAR=123 stack runhaskell testenv.hs
testenv.hs: FOOBAR: getEnv: does not exist (no environment variable)
Run Code Online (Sandbox Code Playgroud)

编译时也是如此:工作时FOOBAR=123 stack exec testenv失败FOOBAR=123 .stack-work/install/BLAHBLAH/testenv

有没有办法强制堆栈传递某些环境变量?

我遇到的真正问题是yesod devel,我想用环境变量覆盖一些设置,但yesod devel使用堆栈来运行程序,因此它们不会通过。

这是 NixOS 18.03.132262.0a73111bc29 上的堆栈 1.6.5。

chr*_*gue 7

似乎这是堆栈手册相关部分,我错过了:

“默认情况下,stack 将在纯 Nix 构建环境(或 shell)中运行构建,这意味着两件重要的事情:(1) 基本上没有环境变量会从您的用户会话转发到 nix-shell [...] ”

所以这个建议奏效了:

“要覆盖此行为,请将 pure: false 添加到您的 stack.yaml 或将 --no-nix-pure 选项传递给命令行。”

% FOOBAR=123 stack --no-nix-pure runhaskell testenv.hs
"123"
Run Code Online (Sandbox Code Playgroud)