0

我正在尝试 HAppStack。我安装了 HAppStack 并创建了一个项目:happstack new project web. 在其下使用项目留言簿创建的新文件夹“web”。所以现在我想运行它。我能做到的唯一方法就是运行cabal install。但我想在不安装 cabal 的情况下运行我的应用程序!执行 run.sh 错误:找不到模块“Paths_guestbook”。我该怎么做?

编辑:一般来说,有没有办法像在 Snap 中那样运行 HAppStack 应用程序而无需重建?

4

2 回答 2

1

一般来说,您可以随时构建 Cabal 项目而无需安装,只需执行以下操作:

$ cabal configure
$ cabal build

生成的可执行文件通常会被调用dist/build/<project>/<project>

您遇到的具体错误是因为必须使用 Cabal 构建代码才能获取Paths_guestbook模块,该模块将包含有关其使用的数据文件位置的信息。(如果您在不安装可执行文件的情况下运行可执行文件,则可能无法找到这些数据文件;在这种情况下,您将需要更精细的解决方案,例如cabal-dev。)

(我不是 Happstack 用户,所以我不知道是否有正式的方法来实现这一点,但这应该适用于基本上任何基于 Cabal 的项目。存储库显示run.sh最后修改于 2009 年,所以我怀疑它只是有点烂。不过,它并没有做任何特别的事情,所以cabal build应该可以正常工作。)

于 2012-01-26T11:52:30.560 回答
0

简洁版本:

run.sh 似乎缺少包含参数。将其修改为如下所示:

#!/bin/sh
runghc -isrc -isrc-interactive-only src/Main.hs

我已更新 darcs 中的 run.sh 以包含此更改。

长版:

通常,Happstack 应用程序不需要该标志。你通常可以这样做,runhaskell Main.hs. 但在该特定示例中, Main.hs 显式导入:

import Paths_guestbook (version)

它在versionInfo函数中使用,以便服务器可以报告自己的版本号。虽然版本号src-interactive-only是硬编码的,并且通常会过时。因此,只有当您实际使用 cabal 构建时,它才是正确的。

Paths_guestbook模块通常在cabal build运行时自动创建。因此,另一个解决方法是将 run.sh 更改为:

#!/bin/sh
runghc -isrc -idist/build/autogen src/Main.hs

并运行cabal configure && cabal build一次。之后,您将能够使用run.sh(直到您执行 a cabal clean)。

另一种选择是在 .cabal 文件中设置 CPP 标志,并且仅Paths_guestbook在通过 cabal 构建应用程序时导入。

例如在 happstack.com 源代码中:

http://patch-tag.com/r/stepcut/happstackDotCom/snapshot/current/content/pretty/Main.hs

在第 40 行(左右)你会看到一个#ifdef __CABAL__. happstack.com 需要能够知道在哪里可以找到静态内容,例如 .css 文件。在本地目录中执行runhaskell Main.hs时,它将在本地目录的子目录中查找文件。如果您这样做cabal install,它将查看cabal安装数据文件的位置。或者,您可以使用命令行参数覆盖默认位置。(这就是该应用程序的 debian 包装所做的)。

不幸的是,该happstack new project命令有点烂,因为作者成为父母并且很长时间没有时间研究它。为了减少混乱,它可能会从即将发布的 Happstack 版本中删除。

为了真正有用,我认为命令需要提示输入一堆值,然后从一组模板中生成一个新项目。类似于 'cabal init' 的工作方式。但目前,没有人自愿抽出时间来实现这一目标。

要在不重新启动服务器的情况下自动查看对源的更改,您可以使用该happstack-plugins库。这里有一个截屏视频:

http://happstack.blogspot.com/2010/10/recompile-your-haskell-based-templates.html

于 2012-02-02T03:49:44.317 回答