简体   繁体   English

使用GHC API时查找cabal包

[英]Finding cabal packages when using the GHC API

I'm trying to make a program that typechecks haskell files for me using the GHC API. 我正在尝试使用GHC API为我制作一个类似于我的文件的程序。 I've gotten the type checking to work for local files, but I have a specific cabal package that I need to be have available as well (the same package this executable will be a part of). 我已经进行了类型检查以便为本地文件工作,但我有一个特定的cabal包,我需要也可以使用(这个可执行文件将属于同一个包)。 How do add this import dependency? 如何添加此导入依赖项?

I also tried compiling with ghc command line to figure this out, using ghc -package PKG-VER --make Test.hs -v but it only seems to look in the local directory for imports. 我也尝试用ghc命令行编译来解决这个问题,使用ghc -package PKG-VER --make Test.hs -v但它似乎只是在本地目录中查找导入。

My current code looks like this: 我当前的代码如下所示:

import           Control.Exception
import           Control.Monad
import           Control.Monad.State
import           DynFlags
import           Exception
import           GHC
import           GHC.Paths           (libdir)
typecheck :: MonadIO m => [FilePath] -> FilePath -> m ()
typecheck otherincludes fp =
  liftIO . defaultErrorHandler defaultLogAction . runGhc (Just libdir) $ do
    dynflags <- getSessionDynFlags
    void $ setSessionDynFlags dynflags { includePaths = otherIncludes ++ includePaths dynflags }
    target <- guessTarget fp Nothing
    setTargets [target]
    void $ load LoadAllTargets
    deps <- depanal [] False
    forM_ deps $ \ms -> parseModule ms >>= typecheckModule

I managed to make your code read and typecheck itself as followS: 我设法将您的代码读取并进行类型检查,如下所示:

package Test where
import           Control.Exception
import           Control.Monad
import           Control.Monad.State
import           DynFlags
import           Exception
import           GHC
import           GHC.Paths           (libdir)
typecheck :: MonadIO m => [FilePath] -> FilePath -> m ()
typecheck otherincludes fp =
  liftIO . defaultErrorHandler defaultLogAction . runGhc (Just libdir) $ do
    dynflags <- getSessionDynFlags
    void $ setSessionDynFlags dynflags {
        includePaths = otherincludes ++ includePaths dynflags,
        packageFlags = [ExposePackage "ghc"]} }
    target <- guessTarget fp Nothing
    setTargets [target]
    void $ load LoadAllTargets
    deps <- depanal [] False
    forM_ deps $ \ms -> parseModule ms >>= typecheckModule

here is how it runs in ghci: 这是它在ghci中的运行方式:

$ ghci Test.hs -package ghc
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package array-0.4.0.0 ... linking ... done.
Loading package deepseq-1.3.0.0 ... linking ... done.
Loading package containers-0.4.2.1 ... linking ... done.
Loading package filepath-1.3.0.0 ... linking ... done.
Loading package old-locale-1.0.0.4 ... linking ... done.
Loading package old-time-1.1.0.0 ... linking ... done.
Loading package bytestring-0.9.2.1 ... linking ... done.
Loading package unix-2.5.1.0 ... linking ... done.
Loading package directory-1.1.0.2 ... linking ... done.
Loading package pretty-1.1.1.0 ... linking ... done.
Loading package process-1.1.0.1 ... linking ... done.
Loading package Cabal-1.14.0 ... linking ... done.
Loading package binary-0.5.1.0 ... linking ... done.
Loading package bin-package-db-0.0.0.0 ... linking ... done.
Loading package hoopl-3.8.7.3 ... linking ... done.
Loading package hpc-0.5.1.1 ... linking ... done.
Loading package template-haskell ... linking ... done.
Loading package ghc-7.4.1 ... linking ... done.
Ok, modules loaded: Test.
Prelude Test> typecheck [] "Test.hs"
Loading package transformers-0.3.0.0 ... linking ... done.
Loading package mtl-2.1.1 ... linking ... done.
Prelude Test> 

So the trick seems to be to pass the exposed packages in the dynflags argument to setSessionDynFlags . 所以诀窍似乎是将dynflags参数中的暴露包传递给setSessionDynFlags See the DynFlags module for some documentation. 有关一些文档,请参见DynFlags模块。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM