如何在不安装NixOS的情况下运行使用nix-build构建的可执行文件?

时间:2015-01-02 13:14:30

标签: haskell package-managers nixos

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

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

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

  • LIB
  • 尼克斯 - 载体
  • 份额

我的可执行文件存在于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

可执行文件找到所有相对于当前工作目录的文件。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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