假设我有一个项目,它只是一堆带练习的Haskell模块。我想提供一个.ghci
,它自动将所有模块 * 导入 * 到ghci
作用域中。问题是,我不能在.ghci
文件中运行import
和:m +Module.Name
。
很明显cabal repl
正在阅读.ghci
文件,因为像提示符这样的选项被读取了。同样,它正确地加载了模块,但是它没有将它们带入范围(只有一个被导入)。如果我试图将import OtherModule
添加到.ghci
文件,那么我会得到错误
模块是隐藏程序包故障-ghci的成员
也许你需要在你的.cabal文件中把“fail-ghci”添加到build-depends中。
但是我不能把失败-ghci添加到阴谋集团的文件中,因为这个库不能依靠它自己!!
复制。创建一个简单的阴谋计划。例如:
src
|- Module1.hs # include dummy function func1 :: Int
|- Module2.hs # include dummy function func2 :: Int
fail-ghci.cabal
.ghci
fail-ghci.cabal
的含量为
name: fail-ghci
version: 0.1.0.0
license: BSD3
license-file: LICENSE
build-type: Simple
library
exposed-modules:
Module1
, Module2
hs-source-dirs:
src
build-depends:
base >=4.7 && <5
default-language: Haskell2010
如果将.ghci
设置为
:set prompt "> " -- Set this option to ensure .ghci is readed by cabal repl
它将正常工作,并将Module1.hs
带入作用域,因此func1
可用。但Module2.hs
不在作用域中,如果我想使用它,我需要执行import Module2
或等效命令。
现在,我希望这在运行cabal repl
时自动发生,因为我的项目有很多模块。
:set prompt "> " -- Set this option to ensure .ghci is readed by cabal repl
import Module2 -- Equivalent :m +Module2
但是ghci无法导入模块,尽管ghci中的命令正确运行。正确的配置是什么?
2条答案
按热度按时间aydmsdu91#
我喜欢的一个解决方法是在项目中添加一个新模块,可能叫做
DefaultRepl
或类似的模块,它可以导入所有你想要的东西。如果你把它放在暴露模块列表的顶部,那么当你运行cabal repl
时,它就会被加载,并把它导入的所有东西都放到作用域中。pexxcrt22#
我想问题是cabal在加载当前项目之前执行了
.ghci
文件中的命令。实际上,当我在一个类似的项目中执行cabal repl
时,启动输出是:我 * 猜测 * 这可能是因为
cabal repl
启动了一个ghci会话(在启动时加载.ghci
文件),然后使用它的API加载项目环境。(我能够确认.ghci
文件可以从完全安装的包中导入模块,而不是从当前的cabal repl
d项目中导入模块)我不知道有什么方法可以在项目加载后自动执行命令。但是你 * 可以 * 让你的
.ghci
文件定义一个快捷命令来导入你想要的所有模块。这样你至少有一个单一的快速命令可以在你进入ghci shell后执行,而不是手动导入所有的模块。类似这样:然后,您可以在ghci提示符下输入
:loadall
来导入您的模块。