代码之家  ›  专栏  ›  技术社区  ›  George

在Haskell Stack+Nix项目中设置XDG_RUNTIME_DIR

  •  0
  • George  · 技术社区  · 7 年前

    我正在NixOS上运行Haskell项目(使用 stack )利用 XDG_RUNTIME_DIR

    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 ...
    

    但是,这真的是修复此错误的最佳方法吗?

    echo $XDG_RUNTIME_DIR 在NixOS终端我得到

    echo $XDG_RUNTIME_DIR
    /run/user/1000
    

    当我跑的时候 nix-shell 在我的Haskell stack项目中,我也得到了

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

    所以我为什么会犯这样的错误是个谜。

    问题:

    上下文

    以防万一 here $XDG_RUNTIME_DIR 指:

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

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

    我的程序中产生错误的特定FFI调用是对 wl_display_add_socket

    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;
      }
      //...
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Robert Hensing Nguyen Hoang Hiep    7 年前

    正如您所注意到的,堆栈中的Nix纯度特性并不是适用于所有情况。一些环境变量只是某些程序与环境交互所必需的,因此在纯模式下使用Nix集成是没有意义的。依我看,是这样吗 --nix-pure 通常只适用于编译,顺便说一句,它适用于一些简单的程序。

    shell.nix ,通过将此行添加到shell派生:

        XDG_RUNTIME_DIR = builtins.getEnv "XDG_RUNTIME_DIR"
    

    stack exec --no-nix-pure .

    推荐文章