XMonad на Nix - не удается найти xmonad-contrib

Я пытаюсь использовать nix в ubuntu с XMonad в качестве оконного менеджера. У меня это хорошо работает на одном хосте с nixOS, но у меня есть второе устройство, которое еще не готово для nixOS. nix поверх Ubuntu в основном там хорошо работает, но xmonad не может найти вспомогательные библиотеки.

Установлены соответствующие пакеты:

$ nix-env -q | grep xmonad
xmonad-0.13
xmonad-contrib-0.13
xmonad-extras-0.12.1

Но перекомпилируя мой xmonad.hs, он не может найти дополнительные библиотеки:

$ xmonad --recompile
Error detected while loading xmonad configuration file: /home/martyn/.xmonad/xmonad.hs

xmonad.hs:32:1: error:
Failed to load interface for ‘XMonad.Layout.NoBorders’
Use -v to see a list of the files searched for.

...

Please check the file for errors.

Установлены соответствующие файлы:

$ ls /nix/store/*xmonad-contrib*/lib/**/NoBorders*
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Actions/NoBorders.dyn_hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Actions/NoBorders.hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Layout/NoBorders.dyn_hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Layout/NoBorders.hi

Добавив xmonad-contrib в мой nixpkgs config.nix, я добавил эти библиотеки в реестр пакетов ghc:

$ cat ~/.config/nixpkgs/config.nix 
with (import <nixpkgs> {});
{
  packageOverrides = pkgs: with pkgs; {

    myHaskellEnv = pkgs.haskellPackages.ghcWithPackages (haskellPackages: with haskellPackages; [ xmonad-contrib ]);
  };
}
$ nix-env -iA nixpkgs.myHaskellEnv
$ ghc-pkg list | grep xmonad
  xmonad-0.13
  xmonad-contrib-0.13
$

с этим хорошо работает ghc (i):

$ /nix/store/7mkxsq7ydqcgnjbs59v1v47wfxpwrav5-ghc-8.0.2-with-packages/bin/ghc ~/.xmonad/xmonad.hs
[1 of 1] Compiling Main             ( /home/martyn/.xmonad/xmonad.hs, /home/martyn/.xmonad/xmonad.o ) [flags changed]
Linking /home/martyn/.xmonad/xmonad ...

Но даже версия xmonad в этом каталоге не может найти библиотеки:

$ /nix/store/7mkxsq7ydqcgnjbs59v1v47wfxpwrav5-ghc-8.0.2-with-packages/bin/xmonad --recompile
Error detected while loading xmonad configuration file: /home/martyn/.xmonad/xmonad.hs

xmonad.hs:32:1: error:
  Failed to load interface for ‘XMonad.Layout.NoBorders’
  Use -v to see a list of the files searched for.

Я могу обойти это, скомпилировав с помощью ghc, как указано выше, и вручную переместив вывод в ~ / .xmonad / xmonad-x86_64-linux и запустив его. Но это немного хитроумно, и в этом нет необходимости?


person user3416536    schedule 27.06.2017    source источник
comment
Разве эта конкретная xmonad.hs часть вашей конфигурации не должна компилироваться в nix (с точки зрения управления конфигурацией)?   -  person Zeta    schedule 27.06.2017
comment
Я сам не являюсь пользователем xmonad, но вот конфигурационный файл xmonad для @Ptival на NixOS: github.com/Ptival/config/blob/master/xmonad.nix   -  person Zimm i48    schedule 27.06.2017
comment
Возможно, xmonad.hs будет лучше управляться в nix, но я еще не компетентен для этого, и, как показано на примере nixOS, должна быть возможность не работать, но продолжать работать (независимо от того, разумно это или нет).   -  person user3416536    schedule 27.06.2017
comment
Спасибо за ссылку, но эта конфигурация предназначена для установки nixOS, а не nix поверх ubuntu.   -  person user3416536    schedule 27.06.2017


Ответы (1)


Друг решил это для меня в автономном режиме, я воспроизвожу это здесь для других с той же проблемой.

По сути, нам нужно использовать xmonad-with-packages и перечислить пакеты, а не ghc-with-packages.

Для этого мы предоставляем собственный xmonad, на который есть ссылка в ~/.nixpkgs/config.nix:

{
  packageOverrides = pkgs_: with pkgs_; {
    xmonad            = import ./xmonad { nixpkgs = pkgs_; };
  };
}

И заполните ~/.nixpkgs/xmonad/default.nix таким образом:

{ nixpkgs ? import <nixpkgs> {} }:

nixpkgs.xmonad-with-packages.override {
  packages = hPkgs: with hPkgs; [ xmonad-contrib ];
}

Это устанавливает xmonad, который знает, где найти свои библиотеки, и все в порядке!

person user3416536    schedule 27.06.2017
comment
Просто чтобы указать, что после этого следует установить xmonad с nix-env -iA nixpkgs.xmonad, что было непонятно, пока я не прочитал код в вопросе. - person A.P.; 29.03.2018