Как установить и протестировать пакет Haskell, который я разрабатываю локально?

Я разрабатываю пакет Haskell и хотел бы протестировать его, как если бы это был установленный пакет. То есть я хотел бы иметь возможность установить его среди других моих пакетов, а затем либо import, либо :m +.

Я могу успешно собрать свой пакет и (очевидно) успешно установить его, используя

cabal install

который сообщает

Resolving dependencies...
Configuring Exos-0.0.1.0...
Building Exos-0.0.1.0...
Installed Exos-0.0.1.0

но все попытки импортировать пакет терпят неудачу с чем-то вроде (например, в GHCi)

<no location info>:
    Could not find module ‘Exos’
    It is not a module in the current program, or in any known package.

хотя я вижу заполненную папку Exos-0.0.1.0 в моем каталоге Haskell lib. (Даже «удаление» не удается с ghc-pkg unregister, который сообщает ghc-pkg: cannot find package Exos-0.0.1.0.)

Как мне установить и протестировать пакет, который я разрабатываю локально, чтобы он вел себя как часть моей коллекции установленных пакетов Haskell — в частности, чтобы я мог импортировать его (и «удалить»), как любой другой?


Мой пакет имеет структуру

Exos.cabal
Exos/
    Cryo/
        Exos.hs
        Exos/
            Display.hs
            Core.hs

с (соответствующим) содержимым в Exos.cabal

name:                   Exos
version:                0.0.1.0
build-type:             Simple
- ...

library
    exposed-modules:    Cryo.Exos,
                        Cryo.Exos.Display
    other-modules:      Cryo.Exos.Core
    -- other-extensions:
    build-depends:      base >=4.8,
                        containers >= 0.5.5.1,
                        split >= 0.2.2,
                        MissingH >= 1.3.0.1
    -- hs-source-dirs:
    default-language:   Haskell2010

in Exos.hs

module Cryo.Exos
    (
        f,
        g,
        otherFunc
    ) where

import Cryo.Exos.Core
-- ...

in Core.hs

module Cryo.Exos.Core where
-- ...

и в Display.hs

module Cryo.Exos.Display
    (
        showSomething,
        showSomethingElse
    ) where

import Data.Char
-- ...

import Cryo.Exos.Core
import Cryo.Exos

FWIW, внутри моей IDE я могу написать и успешно запустить «Приложение» со следующим разделом в вышеуказанном файле .cabal

executable enigma-hs
    main-is:            Main.hs
    build-depends:      base >=4.8,
                        Exos
    hs-source-dirs:     tests
    default-language:   Haskell2010

и следующий (соответствующий) код в Exos/tests/Main.hs

module Main where

import System.IO

import Cryo.Exos
import Cryo.Exos.Display

main :: IO ()
main = do
    putStr $ showSomething
    putStr $ showSomethingElse
    -- ...

person orome    schedule 14.09.2015    source источник
comment
Используйте песочницу Cabal и cabal repl.   -  person jub0bs    schedule 15.09.2015
comment
@Jubobs: Я не на этом пути. Вопрос в том, как заставить импорт работать среди других моих пакетов.   -  person orome    schedule 15.09.2015
comment
@Jubobs: Чувак, я вижу ответ краем глаза: не import Exos, а import Cryo.Exos! (Очень неловко!) Другая часть вопроса остается, почему ghc-pkg unregister Exos-0.0.1.0 ничего не делает?   -  person orome    schedule 15.09.2015


Ответы (1)


Ошибка проста: если вы посмотрите на пример Main.hs, где вы успешно импортировали модуль, который у вас есть

import Cryos.Expos

и не

import Expos    -- wrong

это потому, что модуль, который вы импортируете, Cryos.Expos из пакета Expos.

person orome    schedule 15.09.2015