模板
默认变量
date
:默认为当天日期,使用世界标准时间,按照 ISO 8601 格式打印(例如,"2014-03-11"
)。datetime
:默认为当天日期和时间,使用世界标准时间,按照 ISO 8601 格式打印(例如,"2014-03-11T16:06:02+00:00"
)。author_name
:默认为"Anonymous"
。author_email
:默认为"[email protected]"
。apps_dir
:在发布项目中创建 OTP 应用的目录。默认为"apps/"
。copyright_year
:默认为当前年份,使用世界标准时间。
全局变量
可以通过编辑 $HOME/.config/rebar3/templates/globals
文件来设置全局变量。
{variables, [
{author_name, "My Name Is A String"},
{copyright_year, "2014-2022", "The year or range of years for copyright"},
{my_custom_var, "hello there"}
]}.
这将允许您为所有模板定义变量。未定义的变量将被忽略并恢复为默认值。
这些变量的覆盖顺序为:默认值 < $HOME/.config/rebar3/templates/globals < 命令行调用
。
内置模板
Rebar3 附带了一些已安装的模板,可以通过调用 rebar3 new
来列出。
$ ./rebar3 new
app (built-in): Complete OTP Application structure.
cmake (built-in): Standalone Makefile for building C/C++ in c_src
escript (built-in): Complete escriptized application structure
lib (built-in): Complete OTP Library application (no processes) structure
plugin (built-in): Rebar3 plugin project structure
release (built-in): OTP Release structure for executable programs
任何自定义插件都将以 <plugin_name> (custom): <description>
的格式显示。
可以通过调用 rebar3 new help <plugin>
获取每个插件的详细信息。
$ ./rebar3 new help plugin
plugin:
built-in template
Description: Rebar3 plugin
Variables:
name="myplugin" (Name of the plugin)
desc="A rebar plugin" (Short description of the plugin's purpose)
date="2014-11-10"
datetime="2014-11-10T18:29:41+00:00"
author_name="Anonymous"
author_email="[email protected]"
copyright_year="2014"
apps_dir="apps/" (Directory where applications will be created if needed)
所有变量都显示了它们的默认值,以及可选的说明(括号内)。这些变量也可以全局覆盖。
可以通过调用以下命令运行模板:
$ ./rebar3 new plugin name=demo author_name="Fred H."
...
$ ./rebar3 new plugin demo author_name="Fred H."
...
然后转到 rebar3 为项目创建的目录。
自定义模板
自定义模板可以添加到 $HOME/.config/rebar3/templates/
中。每个模板至少包含两个文件:
my_template.erl
:可以有多个这样的文件。它们是使用 mustache 模板语法进行变量替换的常规 Erlang 文件(由soranoba 的实现提供)。my_template.template
:称为模板索引,每个模板都有一个,可从rebar3
调用。调用rebar3 new my_template
时,此文件将可见。此文件将不同的 mustache 模板文件组合成一个更具凝聚力的模板。
文件语法
模板索引
以下选项可用:
{description, "This template does a thing"}.
{variables, [
{var1, "default value"},
{var2, "default", "explain what this does in help files"},
{app_dir, ".", "The directory where the application goes"}
]}.
{dir, "{{appdir}}/src"}.
{file, "mytemplate_README", "README"}.
{chmod, "README", 8#644}.
{template, "myapp/myapp.app.src", "{{appdir}}/src/{{name}}.app.src"}.
具体来说:
description
:接受一个字符串,解释模板的用途。variables
:接受两种形式的变量列表:{名称, 默认字符串, 帮助字符串}
;{名称, 默认字符串}
.
{dir, 可模板化的路径字符串}
:创建给定的目录。变量名称可用于路径名。{file, 文件路径, 目标文件路径}
:将文件逐字复制到其目标位置。{template, 文件路径, 可模板化的路径字符串}
:评估给定的模板。FilePath
相对于模板索引。{chmod, 文件路径, 整数}
:更改文件的权限,使用指定的整数值。八进制值可以通过8#640
输入。
示例
例如,我们将为通用测试测试套件创建一个模板。创建目录结构 ~/.config/rebar3/templates/
,然后进入该目录。
我们将从模板索引开始,名为 ct_suite.template
{description, "A basic Common Test suite for an OTP application"}.
{variables, [
{name, "suite", "Name of the suite, prepended to the standard _SUITE suffix"}
]}.
{dir, "test"}.
{template, "ct_suite.erl", "test/{{name}}_SUITE.erl"}.
这告诉 Rebar3 创建测试目录并评估 mustache 模板。所有路径都相对于当前工作目录。
让我们创建模板文件:
-module({{name}}_SUITE).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl"). % Eunit macros for convenience
-export([all/0
,groups/0
%,init_per_suite/1, end_per_suite/1
%,init_per_group/2, end_per_group/2
,init_per_testcase/2, end_per_testcase/2
]).
-export([fail/1]).
all() -> [fail].
groups() -> [].
init_per_testcase(_Name, Config) -> Config.
end_per_testcase(_Name, _Config) -> ok.
fail(_Config) ->
?assert(false).
此文件对名称进行非常简单的变量替换(使用 {{name}}
),这就是它需要做的全部。
让我们转到您拥有的任何现有项目并尝试一下:
$ ./rebar3 new
app (built-in): OTP Application
ct_suite (custom): A basic Common Test suite for an OTP application
lib (built-in): OTP Library application (no processes)
release (built-in): OTP Release structure for executable programs
plugin (built-in): Rebar3 plugin
第一行显示我们的 ct_suite
模板已被检测到并且可用。
让我们看看详细信息:
$ ./rebar3 new help ct_suite
ct_suite:
custom template (/home/ferd/.config/rebar3/templates/ct_suite.template)
Description: A basic Common Test suite for an OTP application
Variables:
name="suite" (Name of the suite, prepended to the standard _SUITE suffix)
date="2014-11-10"
datetime="2014-11-10T18:46:33+00:00"
author_name="Anonymous"
author_email="[email protected]"
copyright_year="2014"
apps_dir="apps/" (Directory where applications will be created if needed)
变量和描述的文档已到位。要应用模板,请转到 OTP 应用的任何顶级目录:
$ ./rebar3 new ct_suite demo
===> Writing test/demo_SUITE.erl
您将看到代码已到位。
插件模板
插件可以自带自己的模板,然后与其他模板一起列出。结构与 ~/.config/rebar3/templates/
中的结构完全相同,只是必须将其放在插件的 priv/
目录中。