haskell:跨沙箱共享模块?

haskell: share modules across sandbox(es)?

我安装了 Diagrams,一切正常。

>cabal install diagrams
Resolving dependencies...
All the requested packages are already installed: diagrams-1.2
Use --reinstall if you want to reinstall anyway.

但是如果我尝试使用它:import Diagrams.Prelude

 Could not find module `Diagrams.Prelude'
  Use -v to see a list of the files searched for. 

并且:

>ghc-pkg list diagrams
WARNING: there are broken packages.
Run 'ghc-pkg check' for more details.
e:/Plang/Haskell Platform\lib\package.conf.d:
    (no packages)
C:\Users\guthrie\AppData\Roaming\ghc\i386-mingw32-7.8.3\package.conf.d:
    (no packages)

(损坏的包都是安装了新版本的旧版本。)

它似乎安装在 .cabal-sandbox 中,但 ghc-pkg 没有报告(?):

C:\Users\guthrie\.cabal-sandbox\i386-windows-ghc-7.8.3-packages.conf.d\图表...

我知道我可以使用“cabal repl”代替 GHCi,它会将对此的其他包库引用添加到路径中,但我想使用其他 Haskell IDE 中安装的这些库(Heat,莱克萨)。

我不确定这个沙盒是否是以前的 cabal 安装的残余,否则无法正常工作,或者新的 cabal 版本 (1.22) 是否自动使用它们,或者...

我发现使用“cabal exec ghc”可能会解决这个问题,但我试过了,虽然我自己输入了显式路径,但我没有找到正确的用法:

-- Good:
ghc --make Program.hs -package-db=c:\users\name\.cabal-sandbox\i386-windows-ghc-7.8.3-packages.conf.d\
-- Fails:
cabal ghc --make Program.hs

目前的IDE也没有这个选项。我是否必须向所有其他使用 GHC 的工具添加指向此目录 ( -package-db= ) 的命令行选项?这是正确的方法吗?

一般来说,IDEs 和其他调用 cabal / GHC 的工具需要注意沙箱,并且根据是否有沙箱,行为会有所不同。我无法与 Leksah 交谈,但对于 emacs,了解 CLI 方式可以使设置 IDE 更容易。

ghci 的沙盒感知等效项是 cabal repl

ghc-pkg 的沙盒感知等效项是 cabal sandbox hc-pkg

可能值得对要构建的图进行 cabalizing。我知道这对于仅依赖于 diagrams-lib 的单个 Haskell 文件来说似乎有点过分了。我发现创建 .cabal 文件(或将可执行部分添加到公共 my-diagrams.cabal)比弄清楚如何制作所有工具(emacs haskell-mode, ghc-mod, hslint, GHC) 在构建非 cabalized 文件时从沙箱中获取包。