首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与cabal-3和ghc (也是ghc-pkg)协同工作?

如何与cabal-3和ghc (也是ghc-pkg)协同工作?
EN

Stack Overflow用户
提问于 2020-08-30 13:42:37
回答 2查看 463关注 0票数 2

随着cabal-3的发布,来自Hackage的包被安装在编译器ghcghc-pkg一无所知的新位置。换句话说,安装了软件包,但没有为ghc注册。Ghcighcghc-pkg无法工作。

例如,

代码语言:javascript
复制
cabal install safe --lib

创建文件t1.hs

代码语言:javascript
复制
import Safe

t1 = tailMay [1,2,3]

让我们试一试:

代码语言:javascript
复制
> ghci t1.hs
GHCi, version 8.10.2: https://www.haskell.org/ghc/:? for help
[1 of 1] Compiling Main (t1.hs, interpreted)

t1.hs: 1: 1: error:
    Could not find module `Safe '
    Use -v (or `: set -v` in ghci) to see a list of the files searched for.
  |
1 | import Safe
  | ^^^^^^^^^^^
Failed, no modules loaded.

这里描述了这个bug

https://github.com/haskell/cabal/issues/6262

还有这里

https://gitlab.haskell.org/ghc/ghc/-/issues/17341

我使用设置系统变量作为临时解决方案

代码语言:javascript
复制
GHC_PACKAGE_PATH=C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db;

(Windwos 10,haskell-dev by chocolatey)

通过On Windows, packages installed with cabal seem to be unavailable in ghc/ghci

但在更新时,我必须手动更改此系统变量。

对于这个问题,有没有更好的解决方案?

注:不幸的是,这个解决方案(通过GHC的环境变量GHC_PACKAGE_PATH)与Cabal不兼容:(

https://github.com/haskell/cabal/issues/1944

EN

回答 2

Stack Overflow用户

发布于 2020-08-30 21:29:37

要实现这一点,一种方法是在当前目录中使用--env标志使这些库可供GHC使用:

代码语言:javascript
复制
~ $ mkdir /tmp/foo
~ $ cd /tmp/foo
/tmp/foo $ cabal install safe --lib --env .
Resolving dependencies...
Build profile: -w ghc-8.8.3 -O1
In order, the following will be built (use -v for more details):
 - safe-0.3.19 (lib) (requires build)
Configuring library for safe-0.3.19..
Preprocessing library for safe-0.3.19..
Building library for safe-0.3.19..
…
 > Installing library in /home/jojo/.cabal/store/ghc-8.8.3/incoming/new-4056/home/jojo/.cabal/store/ghc-8.8.3/safe-0.3.19-92fbaef88124b4508ce447f6245bc793f7a1748247ae68d10e449150df1069af/lib
t1.hs
/tmp/foo $ cat > t1.hs
import Safe

t1 = tailMay [1,2,3]
/tmp/foo $ ls -a
.  ..  .ghc.environment.x86_64-linux-8.8.3  t1.hs
/tmp/foo $ ghci t1.hs
GHCi, version 8.8.3: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /tmp/foo/.ghc.environment.x86_64-linux-8.8.3
[1 of 1] Compiling Main             ( t1.hs, interpreted )
Ok, one module loaded.
*Main> 

请注意,您可能不应该在实际具有foo.cabal文件的目录中执行此操作。详情请参见the documentation of cabal v2-install

票数 1
EN

Stack Overflow用户

发布于 2020-09-12 01:51:53

使用GHC_ENVIRONMENT更好:

代码语言:javascript
复制
  setx  GHC_ENVIRONMENT C:\Users\me\.ghc\x86_64-mingw32-8.10.2\environments\default

它对ghcghci很有帮助。

之后,在C:\Users\me\AppData\Roaming\cabal\config中,我们应该添加

代码语言:javascript
复制
  package-db: C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db

这对cabal很有帮助。

不幸的是,ghc-pkg仍然有问题,并且使用这样的标志:

代码语言:javascript
复制
  ghc-pkg list --user-package-db="C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db"

对于Linux,这些步骤是相似的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63654347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档