我正在尝试 HAppStack。我安装了 HAppStack 并创建了一个项目:happstack new project web
. 在其下使用项目留言簿创建的新文件夹“web”。所以现在我想运行它。我能做到的唯一方法就是运行cabal install
。但我想在不安装 cabal 的情况下运行我的应用程序!执行 run.sh 错误:找不到模块“Paths_guestbook”。我该怎么做?
编辑:一般来说,有没有办法像在 Snap 中那样运行 HAppStack 应用程序而无需重建?
一般来说,您可以随时构建 Cabal 项目而无需安装,只需执行以下操作:
$ cabal configure
$ cabal build
生成的可执行文件通常会被调用dist/build/<project>/<project>
。
您遇到的具体错误是因为必须使用 Cabal 构建代码才能获取Paths_guestbook
模块,该模块将包含有关其使用的数据文件位置的信息。(如果您在不安装可执行文件的情况下运行可执行文件,则可能无法找到这些数据文件;在这种情况下,您将需要更精细的解决方案,例如cabal-dev。)
(我不是 Happstack 用户,所以我不知道是否有正式的方法来实现这一点,但这应该适用于基本上任何基于 Cabal 的项目。存储库显示run.sh
最后修改于 2009 年,所以我怀疑它只是有点烂。不过,它并没有做任何特别的事情,所以cabal build
应该可以正常工作。)
简洁版本:
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