ska*_*tek 7 erlang couchdb release erlang-otp mochiweb
我想构建和部署一个应用程序,其中Django作为前端,YAWS(appmods)或Mochiweb/Webmachine作为后端,CouchDB作为数据存储.此外,我计划广泛使用CouchDB的复制能力,以便为整个应用程序提供高容错能力.
我倾向于认为,为了实现这一点,我必须创建一个单独的OTP版本,它将YAWS和CouchDB作为Erlang/OTP应用程序.
这种方法似乎是正确的吗?如何在OTP应用程序方面组织YAWS和CouchDB以创建可靠的生产设置?这样做有什么最佳做法吗?
Erlang 版本是打包软件的好方法,因为它们包含所有依赖库。这样,不同的 erlang 应用程序可以运行其所需库的不同版本,而不会相互冲突。
处理 Erlang 复杂的发布过程的一种流行方法是让Rebar为您做这件事。他们有一个快速入门指南,可以帮助您走上正确的道路。我不知道您目前是否正在使用 Rebar 来管理您的项目,但它使事情变得更加容易。如果您还没有使用它,那么绝对值得研究一下。
但是,rebar 不会立即包含您的依赖项。为此,您应该修改 reltool.config 文件和所有所需的应用程序。
第一步是添加所有依赖项所在的目录,例如:
{sys, [
...
{lib_dirs, ["../deps"]},
...
}.
Run Code Online (Sandbox Code Playgroud)
然后,将您的依赖项添加为要包含在版本中的应用程序:
{sys, [
...
{app, jiffy, [{incl_cond, include}]},
{app, cowboy, [{incl_cond, include}]},
...
}.
Run Code Online (Sandbox Code Playgroud)
现在,当您运行rebar generate命令时,您的应用程序应该位于 lib 下的目标目录中:
find brawl_server -type d -maxdepth 2
brawl_server
brawl_server/bin
brawl_server/erts-5.9.1
brawl_server/erts-5.9.1/bin
brawl_server/lib
brawl_server/lib/brawl_server-1.1
brawl_server/lib/cowboy-0.6.0
brawl_server/lib/jiffy-0.6.1
brawl_server/lib/kernel-2.15.1
brawl_server/lib/sasl-2.2.1
brawl_server/lib/stdlib-1.18.1
brawl_server/log
brawl_server/log/sasl
brawl_server/releases
brawl_server/releases/1
Run Code Online (Sandbox Code Playgroud)
您还需要确保您自己的 OTP 应用程序知道它需要启动它所依赖的应用程序。如果您有生成的 Rebar 项目,请修改您的<appname>.app.src文件以包含它们:
{application, app, [
...
{applications, [
jiffy,
cowboy,
kernel,
stdlib
]},
...
}.
Run Code Online (Sandbox Code Playgroud)
您应该能够编译和生成版本并使用包含的脚本运行它,如 Rebar 版本处理文章中所述。
但此时,还有一个额外的问题,因为显然普通 CouchDB 不符合 OTP,并且您不能以这种方式包含它。您可以使用另一个发行版:rcouch。我自己还没有尝试过,希望它对你有用。
进一步阅读: