【问题标题】:How to pass environment variables into Haskell programs run via stack?如何将环境变量传递给通过堆栈运行的 Haskell 程序?
【发布时间】: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


【解决方案1】:

好像这是relevant section of the stack manual,我错过了:

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

所以这个建议奏效了:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2018-02-04
    • 2021-05-23
    • 2021-11-27
    相关资源
    最近更新 更多