NixOS和ghc-mod - 找不到模块

时间:2014-06-15 09:48:36

标签: haskell emacs nixos

我试验了emacs中的ghc-mod插件和NixOS 14.04之间的交互问题。基本上,一旦通过nix-env -i安装包,它们就可以从ghc和ghci中看到,由haskell-mode识别,但ghc-mod找不到。

为避免信息重复,您可以在错误提单https://github.com/kazu-yamamoto/ghc-mod/issues/269

中找到所有详细信息以及VM中问题的确切复制。

1 个答案:

答案 0 :(得分:6)

在NixOS上为Haskell设置的当前默认包管理确实适用于使用ghc-api或类似(ghc-modhint,插件,地狱,...的包。 )运行时资源。创建一个Nix表达式需要更多的工作,将它们很好地集成到其他环境中。它被称为为包创建一个包装器表达式,例如看看如何在NixOS上安装GHC。

这是很合理的,因为您尝试创建一个原子的安装过程,但与未知数量的其他系统包进行交互,并使用自己的原子安装和更新。这是可行的,但有更快的解决方法。

看看这个example on the install page on the wiki。而不是试图创建一个原子工作的ghc-mod包,你将它焊接到ghc,所以ghc + ghc-mod是一个原子更新。

我安装了ghc + ghc-mod,并在我的~/.nixpkgs/nixpkgs.nix文件中添加了以下安装脚本。

hsEnv = haskellPackages.ghcWithPackages (self : [                            
  self.ghc                                                                   
  self.ghcMod                                                                
  # add more packages here                                                   
]);

使用以下内容安装软件包:

nix-env -i hsEnv
大部分时间

或更好:

nix-env -iA nixpkgs.haskellPackages.hsEnv

我有上面的别名所以我不必每次都输入它。它只是:

nixh hsEnv

此方法的缺点是,使用nix-env -i[A]安装的其他Haskell软件包将无法与上述安装一起使用。如果我想让一切都与镜头包一起使用,那么我将不得不改变安装脚本以包含lens,如:

hsEnv = haskellPackages.ghcWithPackages (self : [                            
  self.ghc                                                                   
  self.ghcMod 
  self.lens                                                               
  # add more packages here                                                   
]);

并重新安装。 Nix似乎没有在hsEnv中使用lensghc-mod以及使用来自nix-env -i ghc的ghc的不同安装,所以显然在大多数情况下只需要在幕后发生一点点安装以上述方式组合现有包。

使用上面的脚本安装了

ghc-mod,但我还没有测试过它与Emacs的集成。

添加到github线程的附加说明

DanielG:

  

我在使用这个环境时遇到了一些麻烦,我甚至无法安装cabal以正常运行:/我只是遇到了很多错误:

使用Nix和NixOS,你几乎从未使用Cabal在全球范围内安装

  • 如果您要使用cabal-install,请务必使用沙箱。你可能不需要它,但它在那里,它的工作原理。
  • 在安装ghcWithPackagesghc-mod之类的软件包时使用hint,或者任何需要对现有软件包进行大量运行时感知的内容(它们很难生成原子并且ghcWithPackages绕过这个为GHC)。
  • 如果您正在开发使用nix-env -i stdenv安装标准posix工具套件。 NixOS不会强迫您使用您不一定需要的工具来使用命令行和PATH。
  • cabal假设存在一些标准工具,例如arpatch(我认为),以及其他一些标准工具,如果内存服务我是正确的。

如果您在需要时使用标准安装方法和/或ghcWithPackages,那么NixOS将在包级别上进行重复数据删除(如果您绘制依赖关系树,它们将指向/nix/store中的相同包, nix-store --optimise始终可以在文件级别对商店进行重复数据删除。),许多软件包会自动与cabal沙箱不同。


对评论的回应

[carlo@nixos:~]$ nix-env -iA nixos.pkgs.hsEnv

installing `haskell-env-ghc-7.6.3'
these derivations will be built:
  /nix/store/39dn9h2gnp1pyv2zwwcq3bvck2ydyg28-haskell-env-ghc-7.6.3.drv
building path(s) `/nix/store/minf4s4libap8i02yhci83b54fvi1l2r-haskell-env-ghc-7.6.3'
building /nix/store/minf4s4libap8i02yhci83b54fvi1l2r-haskell-env-ghc-7.6.3
collision between `/nix/store/1jp3vsjcl8ydiy92lzyjclwr943vh5lx-ghc-7.6.3/bin/haddock' and `/nix/store/2dfv2pd0i5kcbbc3hb0ywdbik925c8p9-haskell-haddock-ghc7.6.3-2.13.2/bin/haddock' at /nix/store/9z6d76pz8rr7gci2n3igh5dqi7ac5xqj-builder.pl line 72.
builder for `/nix/store/39dn9h2gnp1pyv2zwwcq3bvck2ydyg28-haskell-env-ghc-7.6.3.drv' failed with exit code 2
error: build of `/nix/store/39dn9h2gnp1pyv2zwwcq3bvck2ydyg28-haskell-env-ghc-7.6.3.drv' failed

以碰撞开始的线告诉你出了什么问题:

collision between `/nix/store/1jp3vsjcl8ydiy92lzyjclwr943vh5lx-ghc-7.6.3/bin/haddock' and `/nix/store/2dfv2pd0i5kcbbc3hb0ywdbik925c8p9-haskell-haddock-ghc7.6.3-2.13.2/bin/haddock' at /nix/store/9z6d76pz8rr7gci2n3igh5dqi7ac5xqj-builder.pl line 72.

这是两个不同的黑线鳕之间的冲突。切换到新配置文件,然后重试。由于这是一个焊接ghc +包,它不应该安装在与其他Haskell包的配置文件中。这并不能阻止你同时从两个包中运行二进制文件和中断程序,它们只需要在自己的名称空间中,所以当你调用haddock,cabal,ghc时,每个配置文件只有一个选项。

如果您不熟悉配置文件,可以使用:

nix-env -S /nix/var/nix/profiles/per-user/<user>/<New profile name>

默认配置文件可以是defaultchannels,也不是您设置的配置文件。但请检查它,以便稍后切换回来。有一些技巧,以便您不必使用/nix/var/nix/profiles/目录存储配置文件以减少键入,但这是默认位置。