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

How to pass environment variables into Haskell programs run via stack?

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

-- testenv.hs
import System.Environment
main :: IO ()
main = print =<< getEnv "FOOBAR"

如果我 运行 它没有堆栈,就像这样,它有效:

% FOOBAR=123 runhaskell testenv.hs
"123"

但是使用堆栈:

% FOOBAR=123 stack runhaskell testenv.hs
testenv.hs: FOOBAR: getEnv: does not exist (no environment variable)

编译时也是如此:FOOBAR=123 stack exec testenv 失败,而 FOOBAR=123 .stack-work/install/BLAHBLAH/testenv 有效。

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

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

这是 NixOS 18.03.132262.0a73111bc29 上的堆栈 1.6.5。

这似乎是我错过的 relevant section of the stack manual

“By default, stack will run the build in a pure Nix build environment (or shell), which means two important things: (1) basically no environment variable will be forwarded from your user session to the nix-shell [...]”

所以这个建议奏效了:

“To override this behaviour, add pure: false to your stack.yaml or pass the --no-nix-pure option to the command line.”

% FOOBAR=123 stack --no-nix-pure runhaskell testenv.hs
"123"