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

如何使用氮气作为Erlang应用程序的GUI前端?,erlang,otp,nitrogen,Erlang,Otp,Nitrogen,我有一个基本的服务器端Erlang应用程序(还没有完全OTP),我在命令行上启动它。我想把它变成一个交互式系统,使用浏览器作为带有氮的GUI(版本2.0.4)。总的计划是 将当前模块转换为gen_服务器作为模型部件;它分析数据并从中生成事件,这些事件反映了我感兴趣的数据的某些属性 添加一个控制器模块,它既是gen_事件(用于拾取模型生成的事件)又是gen_服务器(用于允许从GUI前端进行查询) 使用氮气作为视图,通过调用控制器模块(控制器模块反过来查询模型)使用Ajax工具更新相关页面 据我

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

  • 将当前模块转换为gen_服务器作为模型部件;它分析数据并从中生成事件,这些事件反映了我感兴趣的数据的某些属性
  • 添加一个控制器模块,它既是gen_事件(用于拾取模型生成的事件)又是gen_服务器(用于允许从GUI前端进行查询)
  • 使用氮气作为视图,通过调用控制器模块(控制器模块反过来查询模型)使用Ajax工具更新相关页面
据我所知,我想要一个有三个孩子的通用应用程序主管:模型、视图和控制器。然后,他们将通过映射到OTP通信模式的API相互通信

这就是我被困的地方:我应该把所有这些都放进氮目录树吗?我是否应该建立一个新的应用程序目录结构,并将三个组件(包括氮)放在下面?作为我的应用程序主管的孩子,我需要做什么来启动氮气服务器(氮气启动脚本看起来比我预期的要复杂得多)?我已经开始学习Erlang和OTP,但还没有完全完成。后天我需要演示系统;)


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

不久前,我发现这是关于在web服务器下使用氮气作为库的。 Yaws有很多功能(例如嵌入式模式),非常适合OTP兼容的应用程序


这不是一个完整的答案,但我希望这些信息可能会有所帮助。

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

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

例如:模型和控制器将在应用程序中实现。然后在应用程序中公开模块中的函数调用(可能是gen_服务器的行为),您可以直接从页面调用这些函数。美妙的是,所有这些都将在同一个代码路径中

操作方法:查看氮气
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)"
这样做的好处是,如果您碰巧更改了视图,例如,您将不需要对模型或控制器进行更改,而是可以从任何视图类型库调用公开的API。

您可以尝试本博客文章中描述的步骤

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

Nitrogen--|--/apps --|--/my_app-1.0 --|--/ebin |--/doc |--/rel |--/support |--/Quickstart "$NITROGEN/apps/my_app-1.0/ebin" 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()"