4

这是我的nixos版本:

$ nixos-version 
16.09pre85931.125ffff (Flounder)

这是我的shell脚本:

$ cat test.nix 
{ nixpkgs ? import <nixpkgs> {
}, compiler ? "ghc801" }:

let
  inherit (nixpkgs) pkgs;
  ghc = pkgs.haskell.packages.${compiler}.ghcWithPackages (ps: with ps; [
    diagrams
    diagrams-pgf
  ]);
in
pkgs.stdenv.mkDerivation {
  name = "test";
  buildInputs = with pkgs; [
    ghc
  ];
  shellHook = ''
    eval $(egrep ^export ${ghc}/bin/ghc)
  '';
}

这是问题所在。请注意,同一包的同一版本的两个实例之间存在冲突:

$ nix-shell --pure test.nix 
these derivations will be built:
  /nix/store/r6080kvlvdb16c1frz8alnm14xjizkf5-ghc-8.0.1.drv
building path(s) ‘/nix/store/1129nds6xhq6hqawdd2s9z9n6va57jgl-ghc-8.0.1’
collision between `/nix/store/amdnmbd8p52d49bqmphv9f7ly7lf7pkk-active-0.2.0.10/share/doc/x86_64-linux-ghc-8.0.1/active-0.2.0.10/html/Data-Active.html' and `/nix/store/yniw6akz2ldimdlj9yq968ldaf4j18h1-active-0.2.0.10/share/doc/x86_64-linux-ghc-8.0.1/active-0.2.0.10/html/Data-Active.html'
builder for ‘/nix/store/r6080kvlvdb16c1frz8alnm14xjizkf5-ghc-8.0.1.drv’ failed with exit code 255
error: build of ‘/nix/store/r6080kvlvdb16c1frz8alnm14xjizkf5-ghc-8.0.1.drv’ failed
/run/current-system/sw/bin/nix-shell: failed to build all dependencies

我知道如果包有不同的版本,那么我可以这样做:

$ nix-env --set-flag priority 15 <package>-<version>

但是由于包名和版本都是一样的,不知道怎么办。

我怎样才能从中恢复过来?

4

2 回答 2

2

ghcWithPackages有效地创建了一个全新的 GHC 发行版,经过定制以包含您列出的软件包。那是与 不同的东西pkgs.ghc,而不仅仅是依赖于它的东西;将两者安装到同一个环境中是没有意义的。我认为您不小心提到了两者,这就是造成冲突的原因。

首先,您制作您的个人 GHC 并将其作为名称纳入范围ghc,使用let.

let你说的范围内:

buildInputs = with pkgs; [
  ghc
];

将 的with每个属性都pkgs带入以下表达式的范围。pkgs有一个ghc属性,并且with作用域是包含ghc绑定的最内层作用域,因此它优先ghclet.

另一方面,您shellHook不在with. 所以 the${ghc}是对你的 let-bound 的引用ghc。这使您的推导也依赖于此。

如果这是正确的,解决方案将是:

  1. 删除with, 因此构建输入列表与您的其余代码相同(使用合格的引用来获取此处未包含ghc的任何其他内容)pkgs
  2. 移动with外部let,所以你的版本ghc是最里面的绑定(但是你会用来自的所有东西污染整个文件的命名空间,pkgs当它变得更复杂时会变得混乱)
  3. 在您let使用不同的变量名(myghc或其他名称)并在任何地方引用它
于 2016-10-19T05:58:45.703 回答
2

当试图在 nixpkgs commit 重现您的问题时125ffff,我得到了一个不同的错误。即:

src/System/Texrunner/Online.hs:45:1: warning: [-Wunused-imports]
    The import of ‘Control.Applicative’ is redundant
      except perhaps to import instances from ‘Control.Applicative’
    To import instances alone, use: import Control.Applicative()
[3 of 3] Compiling System.Texrunner ( src/System/Texrunner.hs, dist/build/System/Texrunner.o )

src/System/Texrunner.hs:18:1: warning: [-Wunused-imports]
    The import of ‘Control.Applicative’ is redundant
      except perhaps to import instances from ‘Control.Applicative’
    To import instances alone, use: import Control.Applicative()
Preprocessing test suite 'tests' for texrunner-0.0.1.1...
[1 of 2] Compiling Tex.PDF          ( tests/Tex/PDF.hs, dist/build/tests/tests-tmp/Tex/PDF.dyn_o )
[2 of 2] Compiling Main             ( tests/Tests.hs, dist/build/tests/tests-tmp/Main.dyn_o )

tests/Tests.hs:5:1: error:
    Failed to load interface for ‘Tex.LogParse’
    Use -v to see a list of the files searched for.
builder for ‘/nix/store/g3mwscrvwsr9zrr5h14d59w7nh06qmsw-texrunner-0.0.1.1.drv’ failed with exit code 1
cannot build derivation ‘/nix/store/9las78qbxqrlhakhdiqwc2jf7g6i5688-ghc-8.0.1.drv’: 1 dependencies couldn't be built
error: build of ‘/nix/store/9las78qbxqrlhakhdiqwc2jf7g6i5688-ghc-8.0.1.drv’ failed

这使我相信这<nixpkgs>指向您机器上的不同提交。上述问题已在 commit 处得到修复7c7417。截至提交80224e时(撰写本文时的主人),该更改仍然有效。那时我可以重现您的错误。

似乎存在的问题是,diagramsdiagrams-pgf,作为单独的包,取决于不同版本的optparse-applicative. 该软件包diagrams-pgf的整个范围都被较新的版本覆盖,这意味着它还引入了不同版本的依赖项diagrams和其他依赖项。这似乎导致了碰撞。

一个简单的解决方法应该是只依赖diagrams-pgf于你的 nix-shell。大多数图表将作为依赖项引入,diagrams-pgf因此仍然可用。

{ nixpkgs ? import <nixpkgs> {
}, compiler ? "ghc801" }:

let
  inherit (nixpkgs) pkgs;
  ghc = pkgs.haskell.packages.${compiler}.ghcWithPackages (ps: with ps; [
    diagrams-pgf # <--- HERE
  ]);
in
pkgs.stdenv.mkDerivation {
  name = "test";
  buildInputs = with pkgs; [
    ghc
  ];
  shellHook = ''
    eval $(egrep ^export ${ghc}/bin/ghc)
  '';
}

经证实ghc --show-packages

$ ghc --show-packages | grep 'name: diagrams'
name: diagrams-lib
name: diagrams-solve
name: diagrams-core
name: diagrams-pgf

不幸的是,diagrams-svg由 拉入的包diagrams无法使用新版本的optparse-applicative. 因此,目前不可能在不修补其中一些包的情况下diagrams同时构建环境。diagrams-pgf

如果你需要diagrams-contrib,那么以下应该可以解决问题:

{ nixpkgs ? import ~/src/nixpkgs {}
, compiler ? "ghc801" }:

let
  inherit (nixpkgs) pkgs;
  ghc = pkgs.haskell.packages.${compiler}.ghcWithPackages (ps: with ps; [
    (diagrams-contrib.overrideScope (self: super: {
      optparse-applicative = self.optparse-applicative_0_13_0_0;
    })) # <--- HERE
    diagrams-pgf
  ]);
in
pkgs.stdenv.mkDerivation {
  name = "test";
  buildInputs = with pkgs; [
    ghc
  ];
  shellHook = ''
    eval $(egrep ^export ${ghc}/bin/ghc)
  '';
}
于 2016-10-19T08:54:46.303 回答