Как переопределить `doctest`, чтобы использовать мой` ghc`? - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблема с использованием doctest с QuickCheck на NixOS

-- code.hs
--
-- $setup
-- >>> import Test.QuickCheck
--
-- |
-- This test will pass
-- >>> 1 + 1
-- 2
--
-- This test use QuickCheck
-- prob> \xs -> reverse xs = reverse . id $ xs
--
-- The last test will fail to ensure doctest was running
-- >>> 1 == 0
-- True
--

main :: IO ()
main = pure ()

По умолчанию haskellPackages.doctest не включает QuickCheck

$ nix-shell -p haskellPackages.doctest --run 'doctest code.hs'
code.hs:4: failure in expression `import Test.QuickCheck'
expected:
 but got:
          <no location info>: error:
              Could not find module ‘Test.QuickCheck’
              It is not a module in the current program, or in any known package.

Examples: 3  Tried: 1  Errors: 0  Failures: 1

, поэтому япопробуйте сделать переопределенную версию как mydoctest

# ~/.config/nixpkgs/overlays/doctest.nix

self: super:
with super.haskellPackages;
let
  myghc = ghcWithPackages (p: with p;
          [
            QuickCheck
          ]);
in
{
  mydoctest = doctest.override {
    ghc = myghc;
  };
}

Он все еще не может найти QuickCheck

$ nix-shell -p mydoctest --run 'doctest code.hs'
code.hs:4: failure in expression `import Test.QuickCheck'
expected:
 but got:
          <no location info>: error:
              Could not find module ‘Test.QuickCheck’
              It is not a module in the current program, or in any known package.

Examples: 3  Tried: 1  Errors: 0  Failures: 1

, но это работает, если я вызываю его через ghc

$ nix-shell -p mydoctest --run 'ghc -e ":!doctest code.hs"'
code.hs:15: failure in expression `1 == 0'
expected: True
 but got: False

Examples: 3  Tried: 3  Errors: 0  Failures: 1

myghc есть, но не использовал mydoctest

$ nix-shell -p mydoctest --run 'doctest --version'
doctest version 0.16.0
using version 8.4.3 of the GHC API
using /nix/store/g1dj8c6h6g8rbb8cv9bgmp1h2f3bxk1l-ghc-8.4.3-with-packages/bin/ghc

$ nix-shell -p mydoctest --run 'which ghc'
/nix/store/qj3vnm903p77nxiraxqxm9b8gbz5rpia-ghc-8.4.3-with-packages/bin/ghc

Как мне сделать doctest, чтобы использовать мое переопределение ghc?

1 Ответ

0 голосов
/ 24 сентября 2018

Производные от Haskell сами по себе не подходят как nix-shell среды.

В руководстве Nixpkgs рекомендуется создать производную только для nix-shell, используя ghcWithPackagesвызов как зависимость.

Если файл, который вы пытаетесь запустить, является частью пакета haskell, вы можете использовать cabal2nix, чтобы выполнить большую часть работы за вас.

Я рекомендую последнее, поскольку оно не загрязняет ваше общедоступное состояние (будь то профиль или наложение пользователя), им легче делиться с другими и обеспечивает структуру, достаточную для масштабирования от игрушечного примера до ценногопакет.

...