我一直在Linux中使用堆栈来编译haskell代码,今天我第一次安装了外部模块。我通过运行以下命令安装了Data.MultiSet:
sudo堆栈安装多集
据说该模块已成功安装,但我无法加载它,当我尝试编译代码时,堆栈会抛出以下消息:
..错误:找不到模块“ Data.MultiSet” ...
我检查了.stack目录中包含的文件,并且有很多文件带有此程序包的名称,但是我对该目录树不是很熟悉。我还尝试在项目的package.yaml的依赖项字段中写入模块的名称,但是它也不起作用。有什么线索吗?谢谢!
答案 0 :(得分:2)
堆栈不能那样工作。 Stack背后的想法是:您有一个 project ,您知道该项目的依赖关系,并且Stack确保您现在或将来始终可以构建该项目。堆栈不是关于以某种方式调整系统以使您可以在此处和现在访问某些软件包的方法。
因此,如果您将要使用Stack进行开发(我个人不是,但是我也不是说这是个坏主意;很多Haskellers都这样做),那么您应该首先将您正在处理的文件设置为项目的一部分。这就像将文件设为堆栈片段一样简单:在文件顶部添加以下内容(我假设它称为script.hs
)
#!/usr/bin/env stack
{- stack --resolver lts-13.0 --install-ghc
runghc --package multiset
-}
(您也可以在命令行上为stack
传递这些标志,但这很快就很繁琐。env
确实没有其他任何作用,但是始终如一。)
然后使您的文件可执行 –在Linux或OSX上可以使用chmod +x script.hs
完成–编译和运行该脚本所需要做的就是./script.hs
。 (不是 stack script.hs
或ghc script.hs
。)这方面的妙处在于,您将获得“即时连续集成”:如果Stack能够立即在计算机上运行脚本,您可以肯定它将来也会在任何其他计算机上运行,而无需记住要安装什么软件包等。
有关该技术的更多信息:https://www.fpcomplete.com/blog/2016/08/bitrot-free-scripts。
如果您编写的不仅仅是一个简单的脚本,则应为其进行正确的Cabal / Stack配置。可以使用cabal init
轻松创建(无论您将使用Cabal还是Stack)。