haskell - 运行 Haskell 应用程序时,Nix 派生不包括 cabal 数据文件

标签 haskell package-managers nixos

我有一个 haskell 项目,它使用 cabal.mkDerivation 进行 Nix 推导。

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

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

  • 垃圾箱
  • 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

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

最佳答案

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

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

关于haskell - 运行 Haskell 应用程序时,Nix 派生不包括 cabal 数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27742846/

相关文章:

haskell - 是否可以对更高种类类型的类实例强制执行类型约束?

ubuntu - apt-get 如何知道如何下载 ElasticSearch?

node.js - 用于获取 Node 和 npm 安装程序的 Nexus 兼容存储库

php - Composer .lock : how does it work?

haskell - 在 M 中是否存在单子(monad)自然的非同一性单子(monad)态射 M ~> M?

ruby - 非常简单的 sexp 解析器

haskell - 如何在 GADT 中使用受限约束?

nixos - 二进制文件或目录不存在

package - 如何在 nixos 中覆盖单个包的编译标志?

nix - 漂亮的 nix attrsets 打印