使用 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,您可以执行以下操作(目前)。
- 克隆 yesod 存储库:https://github.com/yesodweb/yesod.git
- 检查
1304-stack-based-devel
分支。
- 运行
stack install yesod-bin
在 yesod 仓库中。这应该安装 yesod
可执行文件。确保此可执行文件在您的 $PATH
. 上
cd
到您的项目文件夹。
- 运行
yesod devel
在你的项目中(不要 运行 stack exec -- yesod devel
)。
- 如果出现问题,请在您的项目文件夹中尝试以下命令,以确保没有留下以前构建的痕迹:
rm -rf yesod-devel dist .stack-work static/tmp && stack clean && stack build
(这可能有点矫枉过正,但不会造成任何伤害,所以为什么不呢? ).
您现在应该可以再次 运行 开发服务器。
一些随机笔记:
- 要启动交互式解释器,请使用
stack ghci
(而不是 stack exec cabal repl
)。
stack build
和 stack test
像以前一样工作。
已在 yesod issue tracker on GitHub 上跟踪问题。
这里是这个问题的pull request。
我正在使用 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,您可以执行以下操作(目前)。
- 克隆 yesod 存储库:https://github.com/yesodweb/yesod.git
- 检查
1304-stack-based-devel
分支。 - 运行
stack install yesod-bin
在 yesod 仓库中。这应该安装yesod
可执行文件。确保此可执行文件在您的$PATH
. 上
cd
到您的项目文件夹。- 运行
yesod devel
在你的项目中(不要 运行stack exec -- yesod devel
)。 - 如果出现问题,请在您的项目文件夹中尝试以下命令,以确保没有留下以前构建的痕迹:
rm -rf yesod-devel dist .stack-work static/tmp && stack clean && stack build
(这可能有点矫枉过正,但不会造成任何伤害,所以为什么不呢? ).
- 运行
您现在应该可以再次 运行 开发服务器。
一些随机笔记:
- 要启动交互式解释器,请使用
stack ghci
(而不是stack exec cabal repl
)。 stack build
和stack test
像以前一样工作。已在 yesod issue tracker on GitHub 上跟踪问题。
这里是这个问题的pull request。