【问题标题】:How can I use a specific version of a Haskell package with Nix?如何在 Nix 中使用特定版本的 Haskell 包?
【发布时间】:2020-01-27 19:50:06
【问题描述】:

我只想能够在我使用 Nix 构建的项目中使用最新版本的 pandoc,即 Haskell 包。

这是我的 shell.nix 文件。注释掉的部分是我尝试覆盖包版本的地方,但它似乎不起作用。

with import <nixpkgs> {};

( let
    colormath = pkgs.python3Packages.buildPythonPackage rec {
      pname = "colormath";
      version = "3.0.0";

      src = pkgs.python3Packages.fetchPypi{
        inherit version;
        inherit pname;
        sha256 = "05qjycgxp3p2f9n6lmic68sxmsyvgnnlyl4z9w7dl9s56jphaiix";
      };

      buildInputs = [ pkgs.python3Packages.numpy pkgs.python3Packages.networkx ];
    };
    spacy_conll = pkgs.python3Packages.buildPythonPackage rec {
      pname = "spacy_conll";
      version = "1.0.1";

      src = pkgs.python3Packages.fetchPypi{
        inherit version;
        inherit pname;
        sha256 = "1wffwp539i3yvqx6dl3ki5fmmbrpqpnf0ymg5806czk0rh7843j7";
      };

      buildInputs = [ pkgs.python3Packages.spacy pkgs.python3Packages.packaging ];
    };
    # pandoc = pkgs.haskellPackages.pandoc.override {
    #   version = "2.9.1.1";
    #   };

  in pkgs.mkShell {
    shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)";
    buildInputs = with pkgs; [
        (python3.withPackages (ps: with ps; [
          matplotlib
          spacy
          pandas
          spacy_models.en_core_web_md
          jupyter
          scikitlearn
          nltk
          altair
          vega_datasets
          cherrypy
          dominate
          plotly
          colormath
          falcon # Spacy server from Haskell Cookbook
          spacy_conll
          ]))
        (haskellPackages.ghcWithPackages (ps: with ps; [ lens pandoc roman-numerals doclayout ] ))
        ];
      }
  )

【问题讨论】:

    标签: haskell nix


    【解决方案1】:

    Pandoc 2.9.1.1 在 nixpkgs 中以haskellPackages.pandoc_2_9_1_1 的形式提供。我建议您使用它而不是尝试覆盖包,因为依赖项存在一些差异。不过,作为参考,以下是您将如何覆盖 haskellPackages

    let
      hsPkgs = pkgs.haskellPackages.override {
        overrides = self: super: {
          pandoc = pkgs.haskell.lib.overrideCabal super.pandoc {
            version = "2.9.1.1";
            sha256 = "0vc1ld57nv27gwq4mq0wdal8k2wxvsc0f3m2jwq9nkq7wbpwa8cx";
          };
        };
      };
    in pkgs.mkShell {
      buildInputs = with pkgs; [
        (hsPkgs.ghcWithPackages (ps: with ps; [ pandoc ] ))
      ];
    }
    

    【讨论】:

    • 你知道我在哪里可以找到那里的语法解释吗?我不确定我是否理解self: super: 等在做什么,以及为什么pkgs.haskellPackages.overridepkgs.haskell.lib.overrideCabal 在这里都是必需的。
    • self: super: 位是overlayselfsuper 这里指的是我们覆盖 pandoc 前后的新旧 haskellPackages。 AFAIK haskellPackages.overrideoverrideCabal 确保依赖于它的包可以看到对一个包的任何更改,尽管在这种情况下不是很有必要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多