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

时间:2018-05-24 04:52:57

标签: haskell environment-variables haskell-stack nixos

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

-- 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 testenvFOOBAR=123 .stack-work/install/BLAHBLAH/testenv工作时失败。

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

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

这是NixOS 18.03.132262.0a73111bc29上的堆栈1.6.5。

1 个答案:

答案 0 :(得分:4)

这似乎是relevant section of the stack manual,我错过了:

  

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

所以这个建议有效:

  

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

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