我正在试验emacs中的ghc插件与NixOS 14.04之间的交互问题。基本上,一旦通过nix-env -i安装了软件包,就可以从ghc和ghci中看到它们,这是haskell模式所认可的,但ghci却找不到。
为了避免信息重复,您可以在bug票证https://github.com/kazu-yamamoto/ghc-mod/issues/269中找到所有细节,以及VM中问题的准确复制。
发布于 2014-06-15 10:46:39
为NixOS上的Haskell设置的当前默认包管理将适用于使用ghc或类似的包(ghc-mod、hint、插件、地狱、.)运行时资源。创建一个将它们很好地集成到其他环境中的Nix表达式需要做更多的工作。它被称为为包创建一个包装表达式,例如查看如何在NixOS上安装GHC操作。
这是合理的,因为您正在尝试创建一个原子化的安装过程,但它与数量未知的其他系统包与它们自己的原子安装和更新交互。这是可行的,但还有更快的工作要做。
看看这个在wiki的安装页上的示例。。不要试图创建一个原子化的ghc-mod包,而是将它焊接到ghc上,因此ghc+ghc是一个原子更新。
我安装了ghc+ghc,并将下面的安装脚本添加到我的~/.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似乎没有为lens或ghc-mod在hsEnv中使用不同的安装,也没有使用nix-env -i ghc中的ghc,所以很显然,在幕后只需要更多的安装就可以以上述方式组合现有的包。
ghc-mod在上面的脚本中安装得很好,但到目前为止,我还没有测试它与Emacs的集成。
添加到github线程的附加注释
DanielG:
我在使用这个环境时遇到了一些麻烦,我甚至无法让阴谋安装正常运行:/我只是遇到了很多错误,比如:
使用Nix和NixOS,您几乎从不使用Cabal在全局级别进行安装。
cabal-install,请确保使用沙箱。你可能不需要它,但它在那里,它能工作。ghc-mod、hint之类的软件包时使用ghc-mod,或者任何东西都需要对现有的软件包有很强的运行时意识(它们很难使原子化,ghcWithPackages对GHC来说也是如此)。nix-env -i stdenv安装posix工具的标准套件。NixOS并不强迫您使用不一定需要的工具来培养命令行和路径。ar、patch(我认为),如果内存服务正确的话,还有其他一些工具。如果您在需要时使用标准安装方法和/或ghcWithPackages,那么NixOS将在包级别上减少(如果您绘制了一个依赖树,它们将指向/nix/store中的同一个包,nix-store --optimise总是可以在文件级别上对存储进行增强),许多包会自动地不像阴谋式凉鞋盒那样。
对评论的答复
[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+packages,它不应该安装在一个配置文件与其他Haskell软件包。这并不能阻止您同时从两个包中运行二进制文件和中断程序,它们只需要在它们自己的名称空间中运行,所以当您调用黑线鳕鱼、阴谋集团、ghc时,每个配置文件只有一个选择。
如果您还不熟悉配置文件,那么可以使用:
nix-env -S /nix/var/nix/profiles/per-user/<user>/<New profile name>默认配置文件要么是default,要么是channels,而不是为您设置的配置文件。但是请检查一下,这样你就可以稍后切换到它了。这里有一些技巧,这样您就不必使用/nix/var/nix/profiles/目录来存储您的概要文件,以减少键入时的数量,但这是默认位置。
https://stackoverflow.com/questions/24228402
复制相似问题