Haskell Cabal v2和Sandbox

5
我们被告知,这是cabal的传统模式,用于管理用户定义的沙盒:
cabal init sandbox
cabal install <some stuff>

然后,您可以根据自己的意愿加载该内容,使用以下方法:

cabal exec bash

问题:如何使用Cabal的新实现执行等效操作?

目前文档非常晦涩,没有任何使用示例。这将有助于促进迁移。

目前正在考虑使用带有GHC 8.6.5的Cabal 2.4.0.0。


你真的是想要 cabal exec bash 而不是... ghci 或其他什么吗? - Thomas M. DuBuisson
1
在我有限的理解中,一旦我执行 cabal exec bash,沙盒中的内容就会在该 bash 会话中的任何地方都可用,无论我随后调用 ghc 还是 ghci。而在使用 ihaskell 的情况下,它既不是 ghc 也不是 ghci,那么我应该为此执行什么? - pbarill
1个回答

2

这里没有沙盒。你可以使用v2-installv2-install --lib安装软件包,它们会被安装在用户的cabal store中。让我们使用cabal来安装一些软件包:

cabal v2-udpate
cabal v2-install --lib generic-trie containers

现在我们可以在GHCi中从这些包中加载模块:

ghci
> import Data.GenericTrie
> import Data.Map

为什么这样做能够奏效?因为 cabal v2-install --lib 修改了 GHCi 加载包时默认查找的环境。该文件位于 .ghc/x86_64-linux-8.6.5/environments/default
您可以随时删除环境文件以开始几乎全新的环境。如果 cabal 告诉您一些软件包与先前软件包存在冲突依赖关系,那么这非常方便。将其视为全局存储库,但只是指向 nix 风格构建的指针,因此可以轻松地重置并重新构建。

这非常有趣。所以,与其反复清除旧的cabal-sandbox,似乎我只需要处理一个简单的文件。现在我用这种方式安装了几个模块,并且安装成功了。然后我尝试编译/解释一些程序,但是我得到了无数个“Could not load module ... It is a member of the hidden package”。好吧,所以每当我想使用它时,我需要手动添加每个模块,即使它已经在系统范围内安装了??对于使用Haskell在自己的系统上尝试东西的目的来说,这是荒谬的。 - pbarill
你的工作流程中是否需要编译或解释缺少构建文件的项目?如果你经常需要这样做,可以使用 cabal.project*.cabal 文件。如果项目很小甚至只是一个玩具,可以考虑制作一个独立的 #!/usr/bin/env cabal 脚本。如果你的工作流仍然很痛苦,值得单独提出一个问题。 - Thomas M. DuBuisson
我不知道成为一名经验丰富的软件工程师是使用Haskell的必要条件(我看到有些人非常努力地使语言对尽可能多的人不可用)。我不知道什么是“独立的cabal脚本”,也不知道它的目的是什么。 - pbarill
@p_barill 我仍然不清楚需要什么,这就是为什么我建议提出一个单独的问题。您可以在Haskell中使用环境,就像在Python中使用virtualenv一样(我想,我没有使用过那么多)。您可以使用命名环境进行安装,然后使用该环境 cabal v2-install --package-env myenv --lib <packages> ; ghci -package-env myenvimport <module>。如有任何关于cabal的具体问题,请随时提问并@我。 - Thomas M. DuBuisson
我曾经使用 cabal v1 命令和沙盒来缓存 CI/CD 中的构建。这些都位于 .cabal-sandbox 目录下。现在使用 v2 命令后,缓存被放置在其他地方了。那么,对于 v2 命令,我应该在哪里缓存构建以供 CI/CD 使用呢? - CMCDragonkai
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接