Как переопределить пакет Haskell пакетом git / local с Nix при использовании callPackage? - PullRequest
0 голосов
/ 02 июня 2019

По существу я использую это:

default.nix

{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc864" }:
nixpkgs.pkgs.haskell.packages.${compiler}.callPackage ./gitchapter.nix { }

gitchapter.nix

{ mkDerivation, base, directory, extra, filepath, foldl, hpack
, HUnit, mtl, optparse-applicative, pandoc-include-code, parsec
, pretty-simple, process, QuickCheck, rainbow, regex-pcre
, regex-posix, safe, stdenv, string-conversions, system-filepath
, template-haskell, text, transformers, turtle, unix
, unordered-containers
}:
mkDerivation {
  pname = "gitchapter";
  version = "0.1.0.0";
  src = ./.;
  isLibrary = false;
  isExecutable = true;
  libraryToolDepends = [ hpack ];
  executableHaskellDepends = [
    base directory extra filepath foldl HUnit mtl optparse-applicative
    pandoc-include-code parsec pretty-simple process QuickCheck rainbow
    regex-pcre regex-posix safe string-conversions system-filepath
    template-haskell text transformers turtle unix unordered-containers
  ];
  preConfigure = "hpack";
  license = stdenv.lib.licenses.bsd3;
}

Однако существует проблема с невозможностью сборки pandoc-include-code, которая, похоже, была исправлена ​​в репозитории git.Как я могу переопределить пакет, чтобы он указывал на git-репозиторий или локальный каталог?

Буду ли я следовать инструкциям на https://nixos.org/nixos/nix-pills/nixpkgs-overriding-packages.html или это будет работать иначе из-за использования функции nixpkgs.pkgs.haskell.packages.${compiler}.callPackage?


Редактировать: Благодаря ответу @ sara у меня теперь есть:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc864" } :
let
  gitchapter = nixpkgs.pkgs.haskell.packages.${compiler}.callCabal2nix "gitchaper" (./.) {};
  zzzzz = nixpkgs.pkgs.haskell.lib.overrideCabal gitchapter;
in
  nixpkgs.pkgs.haskell.packages.${compiler}.callPackage (zzzzz) { }

Так что теперь я полагаю, что теперь нужно определить, как переопределить эту зависимость сейчас.

Ответы [ 2 ]

2 голосов
/ 02 июня 2019

Рассмотрите возможность использования callCabal2nix из haskell.packages.${compiler}!

Он пройдет через ваш файл .cabal и сгенерирует выражение nix для его деривации (что делает ненужным gitchapter.nix), который затем вы можете переопределить с помощью функции overrideCabal в haskell.lib аналогично переопределение нормального вывода. Затем вы можете получить обновленную версию pandoc из git и добавить ее как buildInput в выражение переопределения.

1 голос
/ 02 июня 2019

Я клонировал репозиторий, который я хотел переопределить в pandoc-include-code/, а затем:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc864" } :
let
  myHaskellPackages = nixpkgs.pkgs.haskell.packages.${compiler}.override {
    overrides = self: super: rec {
    pandoc-include-code  = self.callCabal2nix "pandoc-include-code" (./pandoc-include-code) {};
    };
  };
in
  myHaskellPackages.callCabal2nix "gitchaper" (./.) {}

Для прямой ссылки на репозиторий git:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc864" } :
let
  myHaskellPackages = nixpkgs.pkgs.haskell.packages.${compiler}.override {
    overrides = self: super: rec {
    pandoc-include-code  = self.callCabal2nix "pandoc-include-code" (builtins.fetchGit {
        url = "git@github.com:owickstrom/pandoc-include-code.git";
        rev = "3afe94299b3a473fda0c62fdfd318435117751dd";
      })
      {};
    };
  };
in
  myHaskellPackages.callCabal2nix "gitchaper" (./.) {}
...