Nix 派生在运行 Haskell 应用程序时不包括 cabal 数据文件
Nix derivation does not include cabal data-files when running Haskell application
我有一个 haskell 项目使用 cabal.mkDerivation
进行 Nix 推导。
当我在项目根目录中运行 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
可执行文件查找与当前工作目录相关的所有文件。
安装它也会有同样的问题。使用 makeWrapper 包装您的二进制文件并设置必要的环境变量。
这里正确的解决办法是不修复nix表达式。相反,您应该扩展您的应用程序,使其使用由 cabal 生成的路径模块提供的 getDataFileName
来查找它的文件(您可以将其用作后备)。
有关此的更多信息,请参阅:http://neilmitchell.blogspot.de/2008/02/adding-data-files-using-cabal.html
我有一个 haskell 项目使用 cabal.mkDerivation
进行 Nix 推导。
当我在项目根目录中运行 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
可执行文件查找与当前工作目录相关的所有文件。
安装它也会有同样的问题。使用 makeWrapper 包装您的二进制文件并设置必要的环境变量。
这里正确的解决办法是不修复nix表达式。相反,您应该扩展您的应用程序,使其使用由 cabal 生成的路径模块提供的 getDataFileName
来查找它的文件(您可以将其用作后备)。
有关此的更多信息,请参阅:http://neilmitchell.blogspot.de/2008/02/adding-data-files-using-cabal.html