我正在试用HAppStack。我安装了HAppStack并创建了一个项目:happstack new project web。创建了一个新文件夹'web‘,并在其下创建了项目留言簿。所以现在我想运行它。我唯一能做的就是运行cabal install。但我想运行我的应用程序,而不是安装cabal!执行run.sh错误:找不到模块'Paths_guestbook‘。我该怎么做呢?
编辑:一般来说,有没有像Snap一样不用重建就能运行HAppStack应用程序的方法?
发布于 2012-02-02 11:49:44
简短版本:
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构建的时候才是正确的。
运行cabal build时,通常会自动创建Paths_guestbook模块。因此,另一个修复方法是将run.sh更改为:
#!/bin/sh
runghc -isrc -idist/build/autogen src/Main.hs然后运行一次cabal configure && cabal build。在此之后,您将能够使用run.sh (直到您执行cabal clean)。
另一种选择是在.cabal文件中设置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
发布于 2012-01-26 19:52:31
通常,您可以通过执行以下操作,在不安装的情况下构建Cabal项目:
$ cabal configure
$ cabal build生成的可执行文件通常称为dist/build/<project>/<project>。
您得到的具体错误是因为代码必须使用Cabal构建以获取Paths_guestbook模块,该模块将包含有关它所使用的数据文件的位置的信息。(如果您运行可执行文件而不安装它,可能无法找到这些数据文件;在这种情况下,您需要一个更复杂的解决方案,比如cabal-dev。)
(我不是Happstack的用户,所以我不知道是否有官方的方法来完成这一点,但一般来说,这应该适用于任何基于Cabal的项目。存储库显示run.sh是最后一次修改的in 2009,所以我怀疑它只是有点腐烂。不过,它没有做任何特殊的事情,所以cabal build应该可以很好地工作。)
https://stackoverflow.com/questions/9017702
复制相似问题