Как создать пакет nix со стеком haskell - PullRequest
0 голосов
/ 29 января 2019

Мне нужно создать пакет nix из стека проекта с шаблоном postgres.

По сути это следующее: у меня есть виртуальная машина с NixOS, и мне нужно перенести мой проект на другой с 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;
}

Если я сделаю:

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, что источник распространяется по нескольким каталогам?

1 Ответ

0 голосов
/ 11 февраля 2019

Если вам нужно быстрое исправление, должно работать следующее:

{ 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 - последняя зависимость, которая будет обработана в цикле (ивозможно, во всех вызовах buildStackProject в 18.09, я не уверен), но он не содержит директории /lib или /include, поэтому код выхода, с которым выходит скрипт preConfigure, равен 1, и поэтомувесь процесс сборки завершается.Это просто из-за сокращения &&, оно работало бы, если бы было правильное if.

Однако оно уже исправлено в master (https://github.com/NixOS/nixpkgs/pull/53618),, поэтому просто используйте более новуюnixpkgs должен решить эту проблему.Пиннинг nixpkgs - это то, что вы хотите сделать в любом случае, если вы хотите использовать гарантии репликации Nix в полной мере, так как вы не можете знать, что используете один и тот же коммит nixpkgs, поэтому вы можете использовать разные версиисистемных пакетов.

(Если вы хотите узнать, как я отлаживал это - казалось, проблема была в шаге preConfigure, поэтому я взглянул на код в generic-stack-builder.nix, увидел, что preConfigure был перезаписан, скопировал код оттуда в default.nix и добавил set -x вверху. Это показало мне проблему выше, и побудило меня взглянуть на этот файл в мастере, чтобы увидеть, если не былоизменения с 18.09. Другим обходным решением может быть простое добавление true к сценарию preConfigure, если это не было уже исправлено в master, но в этом не было необходимости.)

(Кроме того, я 'мы открыли https://github.com/NixOS/nixpkgs/issues/55548, чтобы перенести исправление на 18.09.)

...