Run HAppStack app withot cabal

199 views Asked by At

I'm trying out HAppStack. I installed HAppStack and created a project: happstack new project web. New folder 'web' created with project guestbook under it. So now I want to run it. The only way I could do it is run cabal install. But I want to run my app without installing with cabal! Executing run.sh errors: Could not find module 'Paths_guestbook'. How can I do it?

Edit: In general, is there a way to run HAppStack app without rebuild like in Snap?

2

There are 2 answers

1
stepcut On BEST ANSWER

SHORT VERSION:

The run.sh seems to be missing an include paramater. Modify it to look like this:

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

I have update the run.sh in darcs to include this change.

LONG VERSION:

Normally that flag is not needed for Happstack applications. You can usually just do, runhaskell Main.hs. But in that particular example the Main.hs explicitly imports:

import Paths_guestbook (version)

which is used in the versionInfo function so that the server can report its own version number. Though version number in src-interactive-only is hardcoded and will generally be out of date. So it is only correct if you actually build with cabal.

The Paths_guestbook module is normally created automatically when cabal build is run. So, another fix would be to change the run.sh to:

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

And run cabal configure && cabal build once. After that you will be able to use run.sh (until you do a cabal clean).

Another option would be to set a CPP flag in the .cabal file, and only import Paths_guestbook when the application is being built via cabal.

For example in the happstack.com source code:

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

In line 40 (or so) you will see an #ifdef __CABAL__. happstack.com needs to be able to know where to find the static content such as .css files. When doing runhaskell Main.hs in the local directory, it will look for the files in a sub-directory of the local directory. If you do cabal install it will instead look whever cabal installs the data files. Or, you can override the default location with command-line arguments. (Which is what the debian packaging for that app does).

Unfortunately, the happstack new project command is somewhat bitrotten because the author became a parent and has not had time to work on it in a long time. It will likely be removed from the upcoming Happstack release in order to reduce confusion.

In order to be truly useful, I think the command needs to prompt for a bunch of values and then generate a new project from a set of templates. Similar to how 'cabal init' works. But currently, no one has volunteered the time to make that happen.

To see changes to your source appear automatically with out restarting the server you can use the happstack-plugins library. There is an screencast of it here:

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

2
ehird On

In general, you can always build Cabal projects without installing simply by doing:

$ cabal configure
$ cabal build

The resulting executable will usually be called dist/build/<project>/<project>.

The specific error you're getting is because the code must be built with Cabal to get the Paths_guestbook module, which will contain information about the location of data files used by it. (It may be the case that it's unable to find these data files if you run the executable without installing it; in that case, you'll need a more elaborate solution, such as cabal-dev.)

(I'm not a Happstack user, so I don't know if there's an official way to accomplish this, but this should work for basically any Cabal-based project in general. The repository shows that run.sh was last modified in 2009, so I suspect it has simply bit-rotten. It doesn't do anything special, though, so cabal build should work just fine.)