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。
“默认情况下,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)