7

I'm experimenting a problem with the interaction between the ghc-mod plugin in emacs, and NixOS 14.04. Basically, once packages are installed via nix-env -i, they are visible from ghc and ghci, recognised by haskell-mode, but not found by ghc-mod.

To avoid information duplication, you can find all details, and the exact replication of the problem in a VM, in the bug ticket https://github.com/kazu-yamamoto/ghc-mod/issues/269

4

1 回答 1

6

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

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

在 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

这种方法的缺点是安装的其他 Haskell 包nix-env -i[A]将不适用于上述安装。如果我想让所有东西都与 lens 包一起工作,那么我将不得不更改安装脚本以包含以下内容lens

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

并重新安装。Nix 似乎没有为hsEnvlensghc-mod在 hsEnv 和 ghc 中使用不同的安装,nix-env -i ghc因此在大多数情况下,显然只需要在幕后多做一点,以以上述方式组合现有包。

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

添加到 github 线程的附加说明

丹尼尔G:

我在使用这种环境时遇到了一些麻烦,我什至无法让 cabal install 正常运行:/ 我只是遇到很多错误,例如:

使用 Nix 和 NixOS,您几乎从不使用 Cabal 进行全局安装

  • 如果您打算使用cabal-install. 您可能不需要它,但它在那里并且可以工作。
  • ghcWithPackages在安装 , 之类的包ghc-mod或任何需要对现有包有大量运行时意识的东西时使用hint(它们很难成为原子的并且ghcWithPackages为 GHC 解决了这个问题)。
  • 如果您正在开发,请安装标准的 posix 工具套件nix-env -i stdenv。NixOS 不会强迫您使用您不一定需要的工具来培养命令行和 PATH。
  • cabal 假设存在一些标准工具,例如arpatch(我认为)和其他一些工具,如果记忆对我有用的话。

如果您使用标准安装方法和/或ghcWithPackages在需要时,NixOS 将在包级别进行重复数据删除(如果您绘制依赖关系树,它们将指向相同的包/nix/storenix-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/目录来存储您的配置文件以减少打字,但这是默认位置。

于 2014-06-15T10:46:39.363 回答