【问题标题】:Setting XDG_RUNTIME_DIR in a Haskell Stack+Nix Project在 Haskell Stack+Nix 项目中设置 XDG_RUNTIME_DIR
【发布时间】:2019-02-12 00:14:33
【问题描述】:

问题

我正在 NixOS 上运行一个 Haskell 项目(使用 stack),该项目使用了 XDG_RUNTIME_DIR(以防万一:这是一个使用 X11 后端运行的 Wayland 合成器项目)。当我的程序启动时:

stack exec my-compositor-project-exe # nix is enabled by default

我收到一个错误:

error: XDG_RUNTIME_DIR not set in the environment

但是,如果我使用--no-nix-pure 运行,我不会收到错误消息:

stack --no-nix-pure exec my-compositor-project-exe
# ... no error ...

但这真的是解决此错误的最佳方法吗?

请注意,当我在 NixOS 终端中运行 echo $XDG_RUNTIME_DIR 时,我得到了

echo $XDG_RUNTIME_DIR
/run/user/1000

当我在我的 Haskell 堆栈项目中运行 nix-shell 时,我也得到了

[nix-shell:~/my-project]$ echo $XDG_RUNTIME_DIR
/run/user/1000

所以我为什么会得到这个错误是一个谜。

问题:解决这个问题的正确方法是什么?

上下文

如果它很重要here 是一些关于$XDG_RUNTIME_DIR 含义的信息:

有一个相对于用户特定运行时文件和其他文件对象应该放置的基本目录。此目录由环境变量 $XDG_RUNTIME_DI 定义。

...

$XDG_RUNTIME_DIR 定义相对于用户特定的非必要运行时文件和其他文件对象(如套接字、命名管道等)应该存储的基本目录。该目录必须由用户拥有,并且他必须是唯一拥有对该目录的读写权限的人。它的 Unix 访问模式必须是 0700。

...

如果 $XDG_RUNTIME_DIR 未设置,应用程序应退回到具有类似功能的替换目录并打印警告消息。应用程序应将此目录用于通信和同步目的,并且不应在其中放置较大的文件,因为它可能驻留在运行时内存中并且不一定会换出到磁盘。

我的程序中产生错误的特定 FFI 调用是对 wl_display_add_socket(wayland 函数)的调用,它在其主体的顶部:

WL_EXPORT int
wl_display_add_socket(struct wl_display *display, const char *name)
{
  runtime_dir = getenv("XDG_RUNTIME_DIR");
  if (!runtime_dir) {
    wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");

    /* to prevent programs reporting
     * "failed to add socket: Success" */
    errno = ENOENT;
    return -1;
  }
  //...
}

【问题讨论】:

    标签: haskell haskell-stack nix


    【解决方案1】:

    您已经注意到,Stack 中的 Nix 纯度功能并不适用于所有情况。某些环境变量只是某些程序与其环境交互所必需的,因此在纯模式下使用 Nix 集成是没有意义的。我的看法是,--nix-pure 一般只适用于编译,顺便也适用于一些简单的程序。

    如果您喜欢冒险,可以尝试通过您的 shell.nix 显式传递环境变量,方法是将此行添加到您的 shell 派生中:

        XDG_RUNTIME_DIR = builtins.getEnv "XDG_RUNTIME_DIR"
    

    不过,我不会打扰,只需用--no-nix-pure 拨打stack exec

    【讨论】:

    • 感谢您的回答。想要稍微反对你的结论:不使用builtins.getEnv "XDG_RUNTIME_DIR" 让事情变得明确吗?为什么不喜欢--no-nix-pure
    • 确实如此。这是品味和/或要求的问题。我的 shell 已经有 86 个变量,其中许多与桌面集成有关。对我来说,这是一个很好的迹象,表明我将无法预见我的应用程序的库和/或子进程将使用什么。这种方法将在未来和其他人的系统上默认破坏。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多