XMonad on Nix - 无法找到xmonad-contrib

问题描述:

我想在ubuntu上使用nix,并将XMonad作为我的窗口管理器。 我在一台使用nixOS的主机上可以很好地工作,但是我有另一台尚未准备好nixOS的设备。 Ubuntu上的nix大多在那里工作得很好,但xmonad无法找到有贡献的库。XMonad on Nix - 无法找到xmonad-contrib

相关的软件包安装:

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

但是重新编译我的xmonad.hs,它无法找到的contrib库:

$ 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包reg伊士莱:

$ 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并运行它,解决此问题。但是这有点不好意思,肯定不需要?

+0

是不是你的配置中特别的'xmonad.hs'部分,因此应该在nix中(从配置管理的角度来看)进行编译? – Zeta

+0

我自己并不是xmonad用户,但是这里是在NixOS上@Ptival的xmonad配置文件:https://github.com/Ptival/config/blob/master/xmonad.nix –

+0

可能xmonad.hs会更好地管理“在nix之内”,但我还没有能力实现这个目标,并且如nixOS所示,应该可以选择不运行,但仍然可以运行(不管它是否明智)。 – user3416536

一位朋友为我脱机解决了这个问题,我在这里为其他人解决了同样的问题。基本上,我们需要使用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在哪里可以找到它的库,一切都很好!