2011-05-10 81 views
2

我有一个基本的服务器端Erlang应用程序(尚未完全OTP),我从命令行启动。我想把它变成一个使用浏览器作为GUI的交互式系统,使用氮气(版本2.0.4)。总体方案是如何使用氮气作为Erlang应用程序的GUI前端?

  • 把当前模块变成一个gen_server作为MODEL部分;它会分析数据并从中生成反映我感兴趣的数据的某些属性的事件。
  • 添加一个CONTROLLER模块,该模块既是gen_event(用于拾取由模型生成的事件),也是gen_server(用于允许来自GUI前端)
  • 使用氮气作为视图,通过调用控制器模块更新与阿贾克斯设施的相关页面(这反过来查询模型)

至于我可以看到我想一般有三个孩子的应用主管:模型,视图和控制器。然后他们会通过映射到OTP通信模式的API相互交谈。

而这就是我卡住的地方:我应该把所有这些放到Nitrogen目录树中吗?我应该建立一个新的应用程序目录结构,并在那里有三个组件(包括氮气)?我需要做什么来启动氮气服务器作为我的应用程序主管的孩子(氮启动脚本看起来比我预期的要复杂得多)?我已经开始通过厄兰和OTP在行动,但还没有完全完成它。我需要在后天演示系统;)

我想要的是在命令行上键入“start.sh”,然后使用浏览器通过氮气连接到应用程序。

回答

0

由于氮应用程序的构建方式,您不应该与您的应用程序紧密耦合。相反,您构建您的应用程序,提供氮气API(您将通过氮气事件e.t.c调用API)。

然后,你会打包你的应用程序作为一个OTP文件系统,把它放到氮的应用程序文件夹。当氮气开始或开始时,只要它们位于其应用程序目录中,它就会添加应用程序的路径ebin

例如:模型和控制器将在您的应用程序中实现。然后在你的应用程序中,你可以在你的模块中暴露函数调用(这可能是gen_server的行为),你可以从你的氮气页面调用它。美是所有这些将在相同的代码路径。

做什么:你看看氮气quickstart.sh脚本,在它启动erlang虚拟机的地步。

 
echo "Starting Nitrogen on Inets (http://localhost:8000)..." 
erl \ 
    -name YOUR_NODE_NAME_HERE \ 
    -pa ./ebin ../apps/*/ebin ../apps/*/include \ 
    -env ERL_FULLSWEEP_AFTER 10 \ 
    -eval "application:start(nprocreg)" \ 
    -eval "application:start(quickstart)" \ 
    -eval "application:start(YOUR_APPLICATION)" 

如果你的应用是不是像OTP,然后创建一个名为“EBIN”中,你会把你have.The创建一个文件夹,名为梁文件的文件夹:“my_app应用-1。0" 并粘贴此EBIN文件夹中的文件夹

 
    Nitrogen--|--/apps --|--/my_app-1.0 --|--/ebin 
      |--/doc 
      |--/rel 
      |--/support 
      |--/Quickstart 

到您的束文件的完整路径应为

"$NITROGEN/apps/my_app-1.0/ebin"
。 每当氮启动时,它会添加到代码路径所有光束的文件。然后,如果在你的代码你已经启动你的东西的功能说: main_server:start() 你会改变 $NITROGEN/Quickstart/quickstart.sh发现出现这样的 quickstart.sh

 
echo "Starting Nitrogen on Inets (http://localhost:8000)..." 
erl \ 
    -name YOUR_NODE_NAME_HERE \ 
    -pa ./ebin ../apps/*/ebin ../apps/*/include \ 
    -setcookie YOUR_FUNNY_COOKIE_HERE \ 
    -mnesia dir '"PATH/TO/MNESIA/DIRECTORY"' \ 
    -env ERL_FULLSWEEP_AFTER 10 \ 
    -eval "application:start(nprocreg)" \ 
    -eval "application:start(quickstart)" \ 
    -eval "main_server:start()" 

这样做的好处是,如果你碰巧。将您的视图改为erlyweberlang web,您不需要更改模型或控制器,而是暴露了可从任何视图类型库调用的API。

1

前一段时间我发现这个blog post关于使用氮作为一个库在yaws网络服务器。 Yaws拥有很多功能(例如嵌入模式),使其与OTP兼容应用程序完美契合。

不是一个完整的答案,但信息可能是有益的,我希望。

相关问题