NixOS和ghc-mod - 找不到模块

med*_*ans 7 emacs haskell 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中问题的确切复制.

Dav*_*rak 6

目前,默认情况下,包设立哈斯克尔在NixOS管理做的工作将与使用GHC的API,或类似的(包ghc-mod,hint,插件,地狱,...)运行时资源.创建一个Nix表达式需要更多的工作,将它们很好地集成到其他环境中.它被称为为包创建一个包装器表达式,例如,看看如何在NixOS上安装GHC.

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

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                                                   
]);
Run Code Online (Sandbox Code Playgroud)

安装包如下:

nix-env -i hsEnv
Run Code Online (Sandbox Code Playgroud)

或大多数时候更好:

nix-env -iA nixpkgs.haskellPackages.hsEnv
Run Code Online (Sandbox Code Playgroud)

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

nixh hsEnv
Run Code Online (Sandbox Code Playgroud)

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

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

并重新安装.尼克斯似乎没有使用不同的安装用于lensghc-mod在hsEnv并与来自GHC nix-env -i ghc所以显然只有一点点更需要的大部分时间在幕后发生在现有的包以上述方式相结合.

ghc-mod 用上面的脚本安装得很好,但我还没有测试它与Emacs的集成.

添加到github线程的附加说明

DanielG:

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

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

  • 如果要使用,请务必使用沙箱cabal-install.你可能不需要它,但它在那里,它的工作原理.
  • 使用ghcWithPackages时安装软件包的喜欢ghc-mod,hint或者有什么需要现有的程序包的重运行时认识(他们是很难做原子弹,ghcWithPackages围绕这得到了GHC).
  • 如果您正在开发安装标准的posix工具套件nix-env -i stdenv.NixOS不会强迫您使用您不一定需要的工具来使用命令行和PATH.
  • cabal假设存在一些标准工具,例如(我认为),以及其他一些工具ar,patch如果内存服务我是正确的.

如果您使用标准安装方法和/或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
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

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

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

nix-env -S /nix/var/nix/profiles/per-user/<user>/<New profile name>
Run Code Online (Sandbox Code Playgroud)

默认的配置文件是要么default还是channels不要这将是你的设立是哪一个.但请检查它,以便稍后切换回来.有一些技巧,以便您不必使用该/nix/var/nix/profiles/目录存储配置文件以减少键入,但这是默认位置.