如何使用Nitrogen作为Erlang应用程序的GUI前端?

时间:2011-05-10 21:20:12

标签: erlang otp nitrogen

我有一个基本的服务器端Erlang应用程序(还没有完全OTP)我从命令行开始。我想把它变成一个交互式系统,使用浏览器作为GUI与氮气(版本2.0.4)。总体计划是

  • 将当前模块转换为gen_server作为MODEL部分;它分析数据并从中生成事件,反映我感兴趣的数据的某些属性。
  • 添加一个CONTROLLER模块,它既是gen_event(用于获取模型生成的事件),也是gen_server(用于允许来自GUI前端的查询)
  • 使用Nitrogen作为VIEW,通过调用控制器模块(进而查询模型),使用Ajax工具更新相关页面。

据我所知,我想要一个有三个孩子的普通应用程序主管:模型,视图和控制器。然后,他们将通过映射到OTP通信模式的API相互通信。

这就是我被困住的地方:我应该把所有这些都放到氮目录树中吗?我应该设置一个新的app目录结构,并在那里有三个组件(包括氮气)?作为我的应用程序主管的孩子,我究竟需要做些什么才能启动氮服务器(氮启动脚本看起来比我预期的要复杂得多)?我已经开始浏览 Erlang和OTP in Action ,但尚未完成它。我需要在后天演示系统;)

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

3 个答案:

答案 0 :(得分:1)

前段时间我发现这个blog post关于在yaws网络服务器下使用氮气作为库。 Yaws具有很多功能(例如嵌入式模式),非常适合符合OTP标准的应用程序。

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

答案 1 :(得分:0)

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

然后,您将应用程序打包为OTP文件系统,将其放入氮气的apps文件夹中。当氮气生成或启动时,只要它们位于应用目录中,它就会添加应用的ebin路径。

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

怎么做:你看看氮quickstart.sh 脚本,它启动了erlang VM。

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”的文件夹,在其中放置您拥有的光束文件。创建一个名为“my_app-1.0”的文件夹并将该ebin文件夹粘贴到该文件夹​​中< / p>

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

光束文件的完整路径应为

"$NITROGEN/apps/my_app-1.0/ebin"
。 只要氮气启动,它就会将所有光束文件添加到代码路径中。然后,如果在您的代码中,您具有启动您的内容的功能,请说: main_server:start() 。 您将更改quickstart.sh中找到的$NITROGEN/Quickstart/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()"

这样做的好处是,如果您碰巧将视图更改为 erlyweb erlang web ,则无需制作更改模型或控制器,而是暴露可以从任何视图类型库调用的API。

答案 2 :(得分:0)

您可以尝试本博文中描述的步骤 http://rshestakov.wordpress.com/2012/12/30/how-to-install-nitrogen/

它解释了如何将氮作为依赖库添加到您的应用程序