1

我有一个项目,其主要 cabal 组件是一个库

library
  hs-source-dirs:      src
  ...

这也定义了

executable todo
   if !flag(example)
        Buildable: False
   ghc-options: -Wall
   cpp-options: -DGHCJS_BROWSER

   default-language: Haskell2010
   hs-source-dirs: example/todo
   other-modules: TodoDispatcher
                  TodoStore
                  TodoComponents


   main-is: Main.hs

现在,如果我尝试输入检查一个文件,我会收到以下错误

Configuring react-flux-1.0.3...
EXCEPTION: types:
           Could not find module ‘TodoDispatcher’
           Use -v to see a list of the files searched for.

如果我从命令行这样做,我会得到

 $ ghc-mod  --ghcOpt=-v7 type example/todo/TodoViews.hs 29 28                                            not sandboxed
EXCEPTION: types:
           Could not find module ‘TodoDispatcher’
           Locations searched:
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.hs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.lhs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.hsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.lhsig
             src/TodoDispatcher.hs
             src/TodoDispatcher.lhs
             src/TodoDispatcher.hsig
             src/TodoDispatcher.lhsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.hs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.lhs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.hsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.lhsig

所以它似乎忽略了hs-source-dirs我尝试类型检查的当前文件所属的组件的设置,而是考虑包的第一个组件中的那个,就像cabal repl默认情况下所做的那样

By default cabal repl loads the first component in a package.

我怎样才能改变那个漂亮的全局状态?

4

1 回答 1

0

好的,这是您应该做的,以使其正常工作:

  • 您需要编辑 cabal 文件并将组件的标志更改为

    `Buildable : True`
    
  • 然后你可以输入检查

     $ ghc-mod --ghcOpt=-v7 type example/todo/TodoViews.hs 29 28                                            not sandboxed
     29 24 29 34 "[Char]"
     27 25 33 12 "TextInputArgs"
     27 9 33 12 "ReactElementM [
    

在 Emacs 中:

  • 你可能需要离开 Emacs

  • 您需要打开文件和haskell-process-load-file(又名 Cc Cl,又名 Space msb)

它应该已经加载了正确的“目标”,这是 cabal 中“组件”的 haskell 模式用语。如果可行,那么 ghc-mod 也应该。(?)

http://haskell.github.io/haskell-mode/manual/latest/Interactive-Haskell.html

14.8.1 更改 REPL 目标

使用 haskell-session-change-target 您可以更改 REPL 会话的目标。

在 REPL 会话启动后,在 haskell-interactive-mode 缓冲区中调用 haskell-session-change-target 并从可用目标中选择

  • 测试
  • 基准
  • 可执行文件
  • 图书馆

回答“是”以重新启动会话并运行您的测试、基准测试和可执行文件。

于 2016-05-24T14:20:03.403 回答