【问题标题】:How create a nix package with haskell stack如何使用 haskell 堆栈创建 nix 包
【发布时间】:2019-06-21 23:13:04
【问题描述】:

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

基本上是这样的:我有一个带有 NixOS 的虚拟机,我需要将我的项目移植到另一个带有 NixOS 的虚拟机。为此,我将使用 nix 复制命令,但在我需要以某种方式“安装”我的项目使其位于 /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;
}

如果我这样做:

nix build

发生:

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源分布在多个目录?

【问题讨论】:

标签: haskell yesod haskell-stack nix


【解决方案1】:

如果您想快速修复,以下应该可行:

{ 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 版本中,buildStackProject 已损坏。不存在的错误消息是由一个巧妙失败的preConfigure 脚本引起的,该脚本包含以下内容:

    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目录,所以preConfigure脚本退出的退出代码是1,所以整个构建过程退出。这只是因为&amp;&amp; 的简写,如果有正确的if,它就会起作用。

然而,它已经在master (https://github.com/NixOS/nixpkgs/pull/53618) 中修复,因此只需使用更新的 nixpkgs 即可解决该问题。如果您想充分利用 Nix 的可复制性保证,则固定 nixpkgs 是您无论如何都想做的事情,因为您不知道您正在使用相同的 nixpkgs 提交,因此您可能正在使用不同版本的系统包。

(如果您想知道我是如何调试的 - 似乎问题出在preConfigure 步骤中,所以我查看了generic-stack-builder.nix 中的代码,发现preConfigure 是可覆盖的,复制粘贴从那里的代码到default.nix并在顶部添加了set -x。这向我展示了上面的问题,并提示我去查看master中的那个文件,看看自18.09以来是否没有变化。另一种解决方法可以如果master 中尚未修复,则只需将true 添加到preConfigure 脚本中,但这不是必需的。)

(另外,我已打开 https://github.com/NixOS/nixpkgs/issues/55548 将修复程序反向移植到 18.09。)

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多