我刚注意到通过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 testenv
在FOOBAR=123 .stack-work/install/BLAHBLAH/testenv
工作时失败。
有没有办法强制堆栈传递某些环境变量?
我遇到的真正问题是yesod devel
,我想用环境变量覆盖一些设置,但yesod devel
使用堆栈运行程序,因此他们不会使用#{1}}。经过。
这是NixOS 18.03.132262.0a73111bc29上的堆栈1.6.5。
答案 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"