Обновление стека в NixOS до сборки Git Buledge Edge - PullRequest
0 голосов
/ 16 декабря 2018

Я запускаю NixOS, и поэтому у меня возникают проблемы с обновлением stack, поскольку nixpkgs всегда отстает от моей стабильной ветки.Из официальных документов мы можем построить следующую функцию для обновления stack:

upgradeLocalStackInNixOS() {
  git clone https://github.com/commercialhaskell/stack.git stack
  cd stack
  cabal2nix --shell ./. --no-check --no-haddock > shell.nix
  nix-env -i -f shell.nix
}

Проблема: Это приводит к следующей ошибке:

Cloning into 'stack'...
remote: Enumerating objects: 44411, done.
remote: Total 44411 (delta 0), reused 0 (delta 0), pack-reused 44411
Receiving objects: 100% (44411/44411), 14.82 MiB | 1.05 MiB/s, done.
Resolving deltas: 100% (31314/31314), done.
*** found package.yaml. Using hpack...
error: 'f' at /home/george/.dotfiles/nixos/stack/shell.nix:7:7 called without required argument 'pantry', at /nix/store/i9f158cv3dfkn30pb4bssba575h7f409-nixos-18.09.1446.db561c90ef3/nixos/pkgs/development/haskel
l-modules/make-package-set.nix:87:27                                                                                                                                                                              

1 Ответ

0 голосов
/ 17 декабря 2018

Если вам действительно не нужна git-версия, рассмотрите последние варианты в конце ниже горизонтальной линии.

Это несколько методов:

cabal2nix

pantry - это пакет, который распространяется со стеком.Вероятно, вы можете запустить cabal2nix в его каталоге и вручную соединить выражения Nix.

stack

Простым решением может быть stack build stack с использованием вашего предыдущего stack.Хотя это простое решение, оно не является хорошим решением, поскольку не создает корни сборки мусора для зависимостей вашего stack исполняемого файла.

stack2nix

Это немного более экспериментально, немного болееавтоматический, но все же требует небольшого вмешательства.

stack2nix --test --platform x86_64-linux --hackage-snapshot 2018-12-16T10:00:00Z . > stack-custom-snapshot.nix

Теперь у вас есть сгенерированный набор пакетов, аналогичный pkgs.haskell.packages.*, включая пакеты в stack.yaml.Вам придется отключить тесты для стека и кладовой.Это можно сделать с помощью оверлея (другая тема) или путем добавления doCheck = false; к аргументам обоих пакетов в stack-custom-snapshot.nix.Также нужно немного помочь, чтобы найти libyaml:

nix-env -i -f stack-custom-snapshot.nix -A stack --arg pkgs 'import <nixpkgs> { overlays = [(self: super: { yaml = super.libyaml; })]; }'

overlay

Вы можете переопределить атрибут источника пакета стека, используя оверлей.Это требует некоторого опыта работы с оверлеями и работает хорошо, только если требования к стеку не изменились между упакованным стеком и версией git.


Nixpkgs unstable

Хотя не совсемОтвет на ваш оригинальный вопрос, является более простым и достаточным решением для получения последней версии стека.Ниже будут обсуждаться варианты установки из git.

Вы можете включить пакеты из любой версии Nixpkgs в свою конфигурацию NixOS или профиль пользователя.

По каналу

Сначала добавьтеканал

nix-channel --add https://nixos.org/channels/nixos-unstable nixos-unstable
nix-channel --update     # actually fetch your channels

В вашей конфигурации NixOS

environment.systemPackages =
  let
    unstable = import <nixos-unstable> {};
  in
    [ pkgs.figlet unstable.stack pkgs.hello ];

nix-env

Для nix-env создайте файл stack-from-unstable.nix

(import <nixos-unstable> {}).stack

а затем

nix-env -i -f `stack-from-unstable.nix`

Закрепленные nixpkgs

Вместо import <nixos-unstable> вы можете использовать один из методов закрепления .Это гарантирует, что последующие попытки установить его приведут к тому же результату.Это означает, что вам придется обновить его вручную.

...