Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用haskell堆栈创建nix包_Haskell_Yesod_Haskell Stack_Nix - Fatal编程技术网

如何使用haskell堆栈创建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

我需要使用postgres模板从项目堆栈创建nix包

基本上是这样的:我有一个使用NixOS的虚拟机,我需要将我的项目portlet到另一个使用NixOS的虚拟机。为此,我将使用nix copy命令,但在我需要以某种方式“安装”我的项目,使其位于/nix/store之前

我在另一篇文章“从堆栈项目生成Nix包”中也做了同样的尝试

来吧。我所做的是:

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
    '';