脚手架Yesod应用程序与lts-7.9:`堆栈构建`工作,`堆栈测试`工作`堆栈exec - yesod devel`不

时间:2016-11-19 20:39:38

标签: haskell ghc yesod haskell-stack

我正在使用pkb模板使用Yesod构建一个简单的Web应用程序(名为yesod-simple)。我需要一堆在lts-6.25中没有最新版本的库(yesod-simple的当前默认值),所以我将解析器更改为stack.yaml中的lts-7.9。我还阅读了this issue with GHC 8.0.1并通过添加

成功解决了这个问题
{-# LANGUAGE NoDisambiguateRecordFields #-}
{-# LANGUAGE NoRecordWildCards          #-}

在必要时将任何X{..}更改为带记录的显式表示法。现在我的包使用stack build成功构建,使用stack test运行单元测试没有任何问题。当我使用stack exec pkb启动我的应用程序时,我可以访问该网站,一切正常。在GHCi中加载应用程序也可以正常工作(使用stack exec cabal repl,然后在提示符下键入appMain + [Enter]。

现在,当我尝试使用stack exec -- yesod devel(在切换到lts-7.9之前曾经工作)运行开发服务器时,我收到以下错误:

app/devel.hs:2:1: error:
Failed to load interface for ‘Application’
It is a member of the hidden package ‘pkb-0.0.0@pkb-0.0.0-6TveDldRrhNJw1vO6l4VeJ’.
It is a member of the hidden package ‘pkb-0.0.0@pkb-0.0.0-AeggierDgKl46ITEmuA1C2’.

查看stack exec -- yesod -v devel的输出,我可以看到pkb包位于搜索的目录列表中。此外,还存在加载pkb包所需的所有文件:

$ ls -l .stack-work/install/x86_64-linux/lts-7.9/8.0.1/pkgdb
total 12
-rw-r--r-- 1 sam sam 5738 Nov 19 20:26 package.cache
-rw-r--r-- 1 sam sam 2536 Nov 19 20:26 pkb-0.0.0-AeggierDgKl46ITEmuA1C2.conf
$ ls -l .stack-work/install/x86_64-linux/lts-7.9/8.0.1/lib/x86_64-linux-ghc-8.0.1
total 4
drwxr-xr-x 6 sam sam 4096 Nov 19 20:26 pkb-0.0.0-AeggierDgKl46ITEmuA1C2
$ ls -l .stack-work/install/x86_64-linux/lts-7.9/8.0.1/bin
total 27440
-rwxr-xr-x 1 sam sam 28094672 Nov 19 20:26 pkb

那么为什么pkb包仍然根据此错误消息“隐藏”?

我有上述命令here的输出。
如果您需要更多信息,请告诉我,我很乐意提供。

2 个答案:

答案 0 :(得分:0)

猜一猜:自从改变你的解析器后你运行stack build yesod-bin了吗?我的猜测是你正在运行针对旧GHC版本编译的yesod可执行文件。

答案 1 :(得分:0)

临时解决方法:

这个问题最近在yesod代码库中得到了解决,但它还没有在yesod master分支中。要使用yesod devel和GHC 8,您可以执行以下操作(暂时)。

  1. 克隆yesod存储库:https://github.com/yesodweb/yesod.git
  2. 结帐1304-stack-based-devel分行。
  3. 在yesod repo中运行stack install yesod-bin。这应该安装yesod可执行文件。确保此可执行文件位于$PATH
  4. cd到您的项目文件夹。
    1. 在项目中运行yesod devel(不要运行stack exec -- yesod devel)。
    2. 如果出现问题,请在项目文件夹中尝试以下命令,以确保以前的版本中没有留下任何痕迹:rm -rf yesod-devel dist .stack-work static/tmp && stack clean && stack build(这可能有点过分,但不会造成任何伤害,为什么不呢)。
  5. 您现在应该可以再次运行开发服务器。

    一些随机记录:

    • 要启动互动口译员,请使用stack ghci(不是stack exec cabal repl)。
    • stack buildstack test像以前一样工作。

    • 问题在yesod issue tracker on GitHub

    • 上进行了跟踪
    • 以下是此问题的pull request