你需要确保你的目录结构和它的内容被安排好,以便 rebar 知道如何在你的系统中构建所有东西并为它生成一个版本。您的目录结构应如下所示:
project
|
-- rel
|
-- deps
|
-- apps
|
-- myapp
| |
| -- src
| -- priv
|
-- another_app
该rel
目录包含生成发布所需的所有信息,该apps
目录是构成项目的应用程序所在的位置。应用程序依赖项位于deps
目录中。myapp
目录和目录another_app
下的每个应用程序apps
都可以有自己的rebar.config
文件。虽然这里可能有两个或多个这样的应用程序,但通常您只有一个,而所有其他应用程序都是依赖项。
在顶级project
目录中还有一个rebar.config
文件,其内容如下所示:
{sub_dirs, ["rel", "apps/myapp", "apps/another_app"]}.
{lib_dirs, ["apps"]}.
如有必要,您可以使用 rebar 从应用程序骨架生成应用程序:
cd apps
mkdir myapp another_app
( cd myapp && rebar create-app appid=myapp )
( cd another_app && rebar create-app appid=another_app )
如果应用程序具有依赖项,则必须将 a 添加rebar.config
到其目录并在那里声明每个依赖项。例如,如果myapp
依赖于应用程序foo
版本 1.2,则apps/myapp/rebar.config
使用以下内容创建:
{deps,
[{foo, "1.*", {git, "git://github.com/user/foo.git", {tag, "foo-1.2"}}}]
}.
当您运行时rebar get-deps
,rebar 将填充顶级deps
目录以保存所有依赖项,并deps
在必要时创建。如果需要,顶层rebar.config
也可以声明依赖。
您还需要生成一个节点,这是您的发布所必需的:
cd ../rel
rebar create-node nodeid=project
然后您需要修改reltool.config
上一步生成的文件。你需要改变
{lib_dirs, []},
至
{lib_dirs, ["../apps", "../deps"]},
并在行之后{incl_cond, derived},
添加{mod_cond, derived},
,以便发布仅包含正确执行所需的应用程序。
接下来,无论原子'project'
出现在哪里,您都需要将其替换为apps
目录下的应用程序。对于我们的示例,我们将更改这部分:
{rel, "project", "1",
[
kernel,
stdlib,
sasl,
project
]},
对此:
{rel, "project", "1",
[
kernel,
stdlib,
sasl,
myapp,
another_app
]},
并更改这部分:
{app, project, [{mod_cond, app}, {incl_cond, include}]}
对此:
{app, myapp, [{mod_cond, app}, {incl_cond, include}]},
{app, another_app, [{mod_cond, app}, {incl_cond, include}]}
您可能还需要添加以下行:
{app, hipe, [{incl_cond, exclude}]},
排除hipe
应用程序,因为有时它会在版本生成期间或尝试运行版本时导致错误。首先尝试不使用它,但如果您看到与生成版本相关的错误hipe
,或者尝试运行生成的版本导致此类错误,请添加它:
{"init terminating in do_boot",{'cannot load',elf_format,get_files}}
你需要添加它。
完成所有这些后,您现在可以执行:
rebar get-deps compile generate
并且您应该能够成功生成版本。请注意,rebar generate
在顶层而不是在rel
目录中运行将导致像这样的无害警告,您可以忽略它:
WARN: 'generate' command does not apply to directory /path/to/project
最后,您可以运行该版本。以下是使用交互式控制台运行它的方法:
$ ./rel/project/bin/project console
Exec: /path/to/project/rel/project/erts-6.2/bin/erlexec -boot /path/to/project/rel/project/releases/1/project -mode embedded -config /path/to/project/rel/project/releases/1/sys.config -args_file /path/to/project/rel/project/releases/1/vm.args -- console
Root: /path/to/project/rel/project
Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:false]
Eshell V6.2 (abort with ^G)
(project@127.0.0.1)1>
或者您可以运行./rel/project/bin/project start
以在后台启动它。不带参数运行./rel/project/bin/project
以查看所有可用选项。