`
dcaoyuan
  • 浏览: 300585 次
社区版块
存档分类
最新评论

From Rails to Erlyweb - Part II

阅读更多
Updated May 2: erlweb:compile(AppDir::string(), Options::[option()]) has option: {auto_compile, Val}, where Val is 'true', or 'false'. In case of development, you can turn on {auto_compile, true}. So, you only need to run erlyweb_app:boot("myapp") once.

2. Manage project

Erlyweb provides erlyweb:compile(App, ..) to compile the source files under app directory. To start an app, you usually should erlydb:start(mysql, ....) and compile app files first. To make life easy, you can put some scripting like code under myproject\script directory. Here's my project source tree:

myproject
  + apps
  |   + myapp
  |       + ebin   
  |       + include
  |       + nbproject
  |       + src
  |           + components
  |           + lib
  |           + services
  |       + test
  |       + www
  + config
  |   * yaws.conf
  + script
      + ebin
      * erlyweb_app.erl

Where, config/yaws.conf contains the configuration that will copy/paste to your real yaws.conf file. Here's mine:

## This is the configuration of apps that will copy/paste to your yaws.conf.

ebin_dir = D:/myapp/trunk/script/ebin
ebin_dir = D:/myapp/trunk/apps/myapp/ebin

<server localhost>
  port = 8000
  listen = 0.0.0.0
  docroot = D:/myapp/trunk/apps/myapp/www
  appmods = </myapp, erlyweb>
  <opaque>
    appname = myapp
  </opaque>
</server>

You may have noticed, all beams under D:/myapp/trunk/script/ebin and D:/myapp/trunk/apps/myapp/ebin will be auto-loaded by yaws.

erlyweb_app.erl is the boot scripting code, which will be used to start db connection and compile the code. Currently I run these scripts manually. I'll talk later.

-module(erlyweb_app).

-export([main/1, boot/1, build/1, start_db/0]).

main([AppName]) ->
    boot(AppName); 
main(_) ->
    usage().

boot(AppName) ->
    build(AppName, true).

build(AppName) ->
    build(AppName, false).

build(AppName, AutoCompile) ->
    start_db(),
    compile(AppName, [{auto_compile, AutoCompile}]).

start_db() ->
    erlydb:start(
        mysql, 
        [{hostname, "localhost"},
         {username, "mememe"},
         {password, "uuu"},
         {database, "myapp_dev"}]).
        
compile(AppName, Options) ->
    erlyweb:compile(
        "./apps/" ++ AppName,
        [{erlydb_driver, mysql}] ++ Options).

usage() ->
    io:format("usage: erlyweb_app AppName\n"),
    halt(1).

So, I start myapp by steps:

cd \myproject
yaws -i -sname yaws
1> erlyweb_app:build("myapp").

The erlyweb_app.erl is almost escript ready, but I use it as module functions currently. It's pre-compiled and erlyweb_app.beam is placed under script/ebin

After I made changes to myapp, I run above erlyweb_app:build("myapp"). again, then everything is up to date.

This is sure not the best way to handle the write-compile-run-test cycle, I'll improve the scripting to let starting yaws as a node, then hot-swap the compiled code to it.

Comparing to Rails, the Erlyweb project management needs improvement, such as store the database configuration in a plain environment file, and auto load it etc.

It's a good experience to play with Rails, I like rake db:migrate, script, config folder of Rails. And Grails also brings some good idea to manage web app project tree. I'll try to bring them into project manager of ErlyBird.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics