【发布时间】:2018-11-03 04:52:17
【问题描述】:
我刚刚注意到通过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 使用堆栈来运行程序,所以它们不会通过。
这是 NixOS 18.03.132262.0a73111bc29 上的堆栈 1.6.5。
【问题讨论】:
-
对于堆栈 1.6.5,我无法用您的示例重现它。会不会是其他一些特殊的环境变量?
-
是的,我也无法重现您的问题,但方法是编译它并使用
FOOBAR=123 stack exec mybin运行它。stack exec似乎是你想要的。 -
实际上,当我说
stack run时,我的意思是stack exec- 我会编辑问题 - 但无论是stack runhaskell/stack runghc/stack exec,它的行为都是一样的。这是 stack-1.6.5 但在 NixOS 上,所以可能是打包的错误? -
这确实与 NixOS 有关。我的全球
config.yaml中有nix: enable: true。关闭此功能后,环境变量会按应有的方式通过。我认为堆栈中的 nix 支持仅意味着它将使用 nix 安装非 Haskell 依赖项;但似乎它可能在 nix-shell 中运行堆栈?
标签: haskell environment-variables haskell-stack nixos