Как я могу добавить пакет Haskell из GitHub в мой файл shell.nix? - PullRequest
1 голос
/ 11 февраля 2020

Итак, у меня есть Haskell проект с shell.nix, который выглядит следующим образом:

{ nixpkgs ? import <nixpkgs> {} }:
let
  inherit (nixpkgs) pkgs;
  ghc = pkgs.haskellPackages.ghcWithPackages (ps: with ps; [
    regex-compat lucid replace-attoparsec hspec cabal-install text-regex-replace optparse-generic lens-regex-pcre clay bytestring charsetdetect AhoCorasick
  ]);
in
pkgs.stdenv.mkDerivation {
  name = "my-haskell-env";
  buildInputs = [ ghc ];
  shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)";
}

Но AhoCorasick не работает, и мне нужно установить его специальную версию, отсюда:

https://github.com/stackbuilders/AhoCorasick

Как мне это сделать? Я предполагаю, что это что-то, использующее pkgs.fetchFromGitHub, но я даже не могу найти документацию для этого в руководствах Nix.

Редактировать: вот что я сейчас пытаюсь:

{ nixpkgs ? import <nixpkgs> {} }:
let
  inherit (nixpkgs) pkgs;
  myAhoCorasickSrc = pkgs.fetchFromGitHub {
    owner = "stackbuilders";
    repo  = "AhoCorasick";
    rev = "cbf76b78612c66e51eb02f24162ace49325c5d61";
    sha256 = "0ci5rywh042yi4ild3i7kx09rmj5v5iswzsah47f8axj1kq5vlci";
  };
  myAhoCorasick = pkgs.haskellPackages.callCabal2nix myAhoCorasickSrc {};
  ghc = pkgs.haskellPackages.ghcWithPackages (ps: with ps; [
    regex-compat
    lucid
    replace-attoparsec
    hspec
    cabal-install
    text-regex-replace
    optparse-generic
    lens-regex-pcre
    clay
    bytestring
    charsetdetect
    myAhoCorasick
  ]);
in
pkgs.stdenv.mkDerivation {
  name = "my-haskell-env";
  buildInputs = [ ghc ];
  shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)";
}

Странно то, что кажется, что он только возвращает оболочку, но пакет отсутствует. Что я делаю неправильно?

1 Ответ

1 голос
/ 11 февраля 2020

Вам нужно сплести свой пакет в набор haskellPackages:

{ nixpkgs ? import <nixpkgs> {} }:
let
  inherit (nixpkgs) pkgs;
  myAhoCorasickSrc = pkgs.fetchFromGitHub {
    owner = "stackbuilders";
    repo  = "AhoCorasick";
    rev = "cbf76b78612c66e51eb02f24162ace49325c5d61";
    sha256 = "0ci5rywh042yi4ild3i7kx09rmj5v5iswzsah47f8axj1kq5vlci";
  };

  myHaskellPackages = pkgs.haskellPackages.override {
    overrides = self: super: with pkgs.haskell.lib; {
      AhoCorasick = super.callCabal2nix "AhoCorasick" myAhoCorasickSrc {};

      clay = doJailbreak (unmarkBroken super.clay);

      replace-attoparsec = super.callHackageDirect {
        pkg = "replace-attoparsec";
        ver = "1.2.0.0";
        sha256 = "0vgvrcv1inf90s620f48ixikpb9rfffq0mc1fxg7ffi8c0sijc2n";
      } {};
    };
  };

  ghc = myHaskellPackages.ghcWithPackages (ps: with ps; [
    regex-compat
    lucid
    replace-attoparsec
    hspec
    cabal-install
    text-regex-replace
    optparse-generic
    lens-regex-pcre
    clay
    bytestring
    charsetdetect
    AhoCorasick
  ]);
in
pkgs.mkShell {
  name = "my-haskell-env";
  buildInputs = [ ghc ];
}

(Кроме того, replace-attoparsec не присутствовал в моих nixpkgs, поэтому я должен был добавить это, и clay был помечен как сломанный, потому что его границы были слишком узкими для hspec / hspec-discover в моих nixpkgs.)

...