如何使用haskell堆栈创建nix包
我需要使用postgres模板从项目堆栈创建nix包 基本上是这样的:我有一个使用NixOS的虚拟机,我需要将我的项目portlet到另一个使用NixOS的虚拟机。为此,我将使用nix copy命令,但在我需要以某种方式“安装”我的项目,使其位于/nix/store之前 我在另一篇文章“从堆栈项目生成Nix包”中也做了同样的尝试 来吧。我所做的是:如何使用haskell堆栈创建nix包,haskell,yesod,haskell-stack,nix,Haskell,Yesod,Haskell Stack,Nix,我需要使用postgres模板从项目堆栈创建nix包 基本上是这样的:我有一个使用NixOS的虚拟机,我需要将我的项目portlet到另一个使用NixOS的虚拟机。为此,我将使用nix copy命令,但在我需要以某种方式“安装”我的项目,使其位于/nix/store之前 我在另一篇文章“从堆栈项目生成Nix包”中也做了同样的尝试 来吧。我所做的是: cd /home/ProjetoApp stack new TesteYesod yesod-postgres cd TestYesod stack
cd /home/ProjetoApp
stack new TesteYesod yesod-postgres
cd TestYesod
stack init --resolver lts-11.22
stack install yesod-bin --install-ghc
我在stack.yaml中添加了:
nix
pure: true
enable: true
packages: [postgresql]
到目前为止还不错。我只能编译和执行堆栈。然后我试图生成一个nix包。在stack.yaml中,我做了:
nix
pure: true
enable: true
shell-file: default.nix
在default.nix中,我做了:
{nixpkgs ? import <nixpkgs> { }, ghc ? nixpkgs.ghc}:
with nixpkgs;
haskell.lib.buildStackProject {
name ="teste-yesod-1.0.0";
src = ./.;
buildInputs = [ postgresql ];
inherit ghc;
}
发生:
builder for '/nix/store/rckhmkgrkb6nzn7dkqqldfdm8cilpya2-teste-yesod
1.0.0.drv' failed with exit code 1; last 5 log lines:
unpacking sources
unpacking source archive /nix/store/
n62hzn4igi1b7khksa6sp3cq8gk4h344-TesteYesod
source root is TestYesod
patching sources
configuring
[0 built (1 failed), 0.0 MiB DL]
error: build of '/nix/store/rckhmkgrkb6nzn7dkqqldfdm8cilpya2-teste-yesod-
1.0.0.drv' failed
如果。如何指示nix源分布在多个目录中?如果需要快速修复,以下操作应该可以:
{ nixpkgs ? import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/d42ef371c9b1b532400b0f2820885e575f4f1617.tar.gz";
sha256 = "0irb4zb6hdgaah238244jk2xf63xfb20xy3plb1194pd4xbgdr3r";
}) {}
, ghc ? nixpkgs.ghc
}:
with nixpkgs;
haskell.lib.buildStackProject {
name ="TesteYesod";
src = ./.;
buildInputs = [ postgresql ];
inherit ghc;
}
有什么问题吗?似乎在当前的18.09版本中,是被破坏的。不存在的错误消息是由一个异常失败的预配置
脚本引起的,该脚本包含以下内容:
addStackArgsHook = ''
for pkg in ''${pkgsHostHost[@]} ''${pkgsHostBuild[@]} ''${pkgsHostTarget[@]}
do
[ -d "$pkg/lib" ] && \
export STACK_IN_NIX_EXTRA_ARGS+=" --extra-lib-dirs=$pkg/lib"
[ -d "$pkg/include" ] && \
export STACK_IN_NIX_EXTRA_ARGS+=" --extra-include-dirs=$pkg/include"
done
'';
在您的例子中,stack
是循环中要处理的最后一个依赖项(可能在18.09中的所有buildStackProject
调用中,我不确定),但它不包含/lib
或/include
目录,因此预配置
脚本退出的退出代码是1
,所以整个构建过程都结束了。这只是因为速记&&
,如果有合适的if
,它就可以工作
但是,它已经在master
中修复了(),因此只需使用较新的nixpkgs就可以解决该问题。如果您想最大限度地使用Nix的可复制性保证,那么固定nixpkgs是您想要做的事情,因为您不知道您正在使用相同的nixpkgs提交,因此您可能正在使用不同版本的系统包
(如果您想知道我是如何调试的-问题似乎出在预配置
步骤中,因此我查看了通用堆栈生成器.nix
中的代码,发现预配置
是可重写的,将代码从那里复制粘贴到default.nix
中,并在顶部添加了set-x
,如图所示。)我发现了上面的问题,并提示我去查看master中的该文件,以查看自18.09以来是否没有任何更改。另一个解决方法可以是简单地将true
添加到预配置
脚本中,如果它在master
中尚未修复,但这不是必需的。)
(另外,我已经打开了18.09补丁的后端口。)似乎与我的问题类似:尝试
nix build--debug
。
addStackArgsHook = ''
for pkg in ''${pkgsHostHost[@]} ''${pkgsHostBuild[@]} ''${pkgsHostTarget[@]}
do
[ -d "$pkg/lib" ] && \
export STACK_IN_NIX_EXTRA_ARGS+=" --extra-lib-dirs=$pkg/lib"
[ -d "$pkg/include" ] && \
export STACK_IN_NIX_EXTRA_ARGS+=" --extra-include-dirs=$pkg/include"
done
'';