[英]Nix derivation does not include cabal data-files when running Haskell application
我有一個使用cabal.mkDerivation
進行 Nix 派生的 haskell 項目。
當我在項目根目錄中運行nix-build
,我會在構建成功后得到預期的result
符號鏈接。
如果我進入該目錄,我有 4 個目錄:
我的可執行文件存在於bin
。 當我嘗試運行我的可執行文件時,它找不到我的應用程序文件和動態庫。 我知道這是由於缺少設置包的所有路徑的環境變量。
如何在不安裝的情況下使用正確的環境變量運行我的包的可執行文件?
我知道我可以使用nix-shell
來使用cabal run
來運行可執行文件,但我想在已部署狀態下運行可執行文件。
這是我的項目中的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 生成的 Paths 模塊提供的getDataFileName
來查找它的文件(您可以將其用作后備)。
有關更多信息,請參見: http : //neilmitchell.blogspot.de/2008/02/adding-data-files-using-cabal.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.