【问题标题】:Nix derivation does not include cabal data-files when running Haskell application运行 Haskell 应用程序时,Nix 派生不包括 cabal 数据文件
【发布时间】:2015-02-28 19:48:42
【问题描述】:

我有一个使用cabal.mkDerivation 进行 Nix 派生的 haskell 项目。

当我在项目根目录中运行nix-build 时,我会在构建成功后得到预期的result 符号链接。

如果我进入那个目录,我有 4 个目录:

  • bin
  • nix 支持
  • 分享

我的可执行文件存在于bin 中。当我尝试运行我的可执行文件时,它找不到我的应用程序文件或动态库。我知道这是由于缺少设置包的所有路径的环境变量。

如何在不安装的情况下使用正确的环境变量运行我的包的可执行文件?

我知道我可以使用nix-shell 来使用cabal run 来运行可执行文件,但我想在部署状态下运行可执行文件。

编辑 #1:更多信息

这是我项目中的default.nix

{ haskellPackages ? (import <nixpkgs> {}).haskellPackages_ghc783_no_profiling }:

let
  inherit (haskellPackages)
    blazeHtml
    ... list of deps
    ;
in
  cabal.mkDerivation (self: {
    pname           = "myproject";
    version         = "0.0.1";
    src             = ./;
    enableSplitObjs = false;

    buildTools = [
      yesodBin
      cabalInstall
    ];

    buildDepends = [
      blazeHtml
      ... list of deps
    ];
})

这是我的 cabal 文件的相关部分,其中包含应用程序使用的数据文件列表:

data-files: config/favicon.ico
          , config/robots.txt
          , config/settings.yml
          , static/css/*.css
          , static/fonts/*.eot
          , static/fonts/*.svg
          , static/fonts/*.ttf
          , static/fonts/*.woff
          , static/img/*.jpg

当使用cabal install 部署应用程序时,结构将是:

  myproject
▾ config
    favicon.ico
    robots.txt
    settings.yml 
▾ static
    ▸ css
    ▸ fonts
    ▸ img

可执行文件查找与当前工作目录相关的所有文件。

【问题讨论】:

  • 您的应用程序通常如何找到它的文件?你使用 cabal 生产的 _Paths 模块吗?
  • @bennofs 目录configstatic 位于项目的根目录中。因此,当我在项目根目录中运行 cabal run 时,会相对查找文件。有关更多信息,请参阅我的编辑。

标签: haskell package-managers nixos


【解决方案1】:

安装它会有同样的问题。用 makeWrapper 包装你的二进制文件并设置必要的环境变量。

【讨论】:

  • 我刚刚发现在cabal.mkDerivation 中启用isExecutable 会自动修复此问题。
  • 知道如何修复应用程序使用的数据文件的查找吗?现在它们存在于$out/share/x86_64-linux-ghc-7.8.3/myproject-0.0.1/。似乎在 nixpkgs 中找不到任何其他应用程序的示例。
【解决方案2】:

这里正确的解决方案是不修复nix表达式。相反,您应该扩展您的应用程序,使其使用由 cabal 生成的 Paths 模块提供的getDataFileName 来查找它的文件(您可以将其用作后备)。

有关更多信息,请参阅:http://neilmitchell.blogspot.de/2008/02/adding-data-files-using-cabal.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2021-08-08
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多