使用 lts-7.9 的脚手架 Yesod 应用程序:`stack build` 有效,`stack test` 有效 `stack exec -- yesod devel` 无效

Scaffolded Yesod application with lts-7.9: `stack build` works, `stack test` works `stack exec -- yesod devel` does not

我正在使用 Yesod 使用 yesod-simple 模板构建一个简单的网络应用程序(称为 pkb)。我需要一堆在 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包根据这个错误信息还是'hidden'?

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

猜一猜:您 运行 stack build yesod-bin 更换了解析器了吗?我猜你是 运行ning 一个针对旧 GHC 版本编译的 yesod 可执行文件。

临时解决方法:

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

  1. 克隆 yesod 存储库:https://github.com/yesodweb/yesod.git
  2. 检查 1304-stack-based-devel 分支。
  3. 运行 stack install yesod-bin 在 yesod 仓库中。这应该安装 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(这可能有点矫枉过正,但不会造成任何伤害,所以为什么不呢? ).

您现在应该可以再次 运行 开发服务器。

一些随机笔记:

  • 要启动交互式解释器,请使用 stack ghci(而不是 stack exec cabal repl)。
  • stack buildstack test 像以前一样工作。

  • 已在 yesod issue tracker on GitHub 上跟踪问题。

  • 这里是这个问题的pull request