我正在试用HAppStack。我安装了HAppStack并创建了一个项目:happstack new project web
。创建了新文件夹"web",下面有项目留言簿。所以现在我想运行它。唯一能做到的方法是运行cabal install
。但我想运行我的应用程序,而不安装阴谋集团!执行run.sh错误:找不到模块"Paths_guestbook"。我该怎么做?
编辑:一般来说,有没有一种方法可以运行HAppStack应用程序而无需像Snap中那样重建?
通常,您只需执行以下操作即可构建Cabal项目,而无需安装:
$ cabal configure
$ cabal build
生成的可执行文件通常称为dist/build/<project>/<project>
。
您遇到的具体错误是,必须使用Cabal构建代码才能获得Paths_guestbook
模块,该模块将包含有关其使用的数据文件位置的信息
(我不是Happstack用户,所以我不知道是否有官方的方法来实现这一点,但这基本上适用于任何基于Cabal的项目。存储库显示run.sh
上次修改是在2009年,所以我怀疑它有点腐烂了。不过,它没有做任何特别的事情,所以cabal build
应该可以正常工作。)
短版本:
run.sh似乎缺少一个include参数。将其修改为如下所示:
#!/bin/sh
runghc -isrc -isrc-interactive-only src/Main.hs
我已经更新了darcs中的run.sh以包含此更改。
长版本:
通常,Happstack应用程序不需要该标志。你通常可以这样做,runhaskell Main.hs
。但在这个特殊的例子中,Main.hs明确导入:
import Paths_guestbook (version)
用于CCD_ 8功能中,以便服务器可以报告其自己的版本号。尽管src-interactive-only
中的版本号是硬编码的,通常会过期。所以,只有当你真的和阴谋集团一起构建时,这才是正确的。
Paths_guestbook
模块通常在cabal build
运行时自动创建。因此,另一个修复方法是将run.sh更改为:
#!/bin/sh
runghc -isrc -idist/build/autogen src/Main.hs
并运行一次cabal configure && cabal build
。之后,您将能够使用run.sh
(直到您完成cabal clean
)。
另一种选择是在.cab文件中设置CPP标志,并且只有在通过cabal构建应用程序时才导入Paths_guestbook
。
例如在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