用于沙箱的最小cabal文件

Deb*_*ski 2 haskell cabal hakyll

我正在尝试用Hakyll库写一个项目.为了避免弄乱我的系统,我将它安装在我的Hakyll项目所在的同一文件夹中的cabal沙箱中.

或多或少是一个初学者,我仍然在努力使害虫做法正确.一个简单的方法就是这样做

$ cabal sandbox init
$ cabal install hakyll
$ cabal exec ghc -- --make site.hs
Run Code Online (Sandbox Code Playgroud)

最后一行使用沙箱中的库编译我的Hakyll生成器.明显的缺点是这是不可再现的.当我尝试从干净的结账再次运行时,Hakyll的主要版本可能会发生变化.

另一种方法是编写一个适当的project.cabal文件(例如像:chromaticleaves.cabal),然后做cabal installcabal run.

但是,我觉得这可能是一个太多的信息.由于我不打算发布这个项目,我不是真的相信我需要在那里放置一个项目名称和版本号.(例如,在Ruby中Gemfile,我也只会指定库而不是其他内容,除非我想自己发布一个gem.)

所以,最终我想到了一个类似的文件

$ cat project.cabal
cabal-version: >= 1.2
library
  build-depends: base   >=4.6
               , containers
               , process
               , hakyll >=4.5
               , pandoc
               , pandoc-types
Run Code Online (Sandbox Code Playgroud)

我可以打字

$ cabal sandbox init
$ cabal install --only-dependencies
$ cabal exec ghc -- --make site.hs
Run Code Online (Sandbox Code Playgroud)

它似乎下载所有依赖项,并能够编译该文件.

这是一个合理的方法,还是真正的最佳实践,在cabal文件中提供名称,版本和可执行部分的完整规范?

编辑:显然,我的方法不允许我这样做cabal repl.所以要么存在一种完全不同的方式,要么似乎我必须采用更全面的规范.

Mik*_*kov 5

我将自己的第一种方法用于基于Hakyll的网页.您无需创建.cabal文件来固定Hakyll版本,您只需要将以下行添加到cabal.config:

constraints: hakyll == 4.5

我认为这cabal repl将适用于这种方法,但您需要site.hs手动加载(:l site.hs).或者你可以使用cabal exec ghci -- site.hs.