文档章节

rebar3文档翻译—配置

易冥天
 易冥天
发布于 2017/02/16 13:12
字数 2395
阅读 375
收藏 0
  1. 全局(所有命令)配置
    1. rebar3支持一些会影响批发工具行为的选项,这些被定义为操作系统环境变量,如下所示:
    2. REBAR_PROFILE="term"         # force a base profile
      HEX_CDN="https://..."        # change the Hex endpoint for a private one
      REBAR_CONFIG="rebar3.config" # changes the name of rebar.config files
      QUIET=1                      # only display errors
      DEBUG=1                      # show debug output
      REBAR_COLOR="low"            # reduces amount of color in output if supported
  2. 工件
    1. 工件是一个文件列表,这些文件是成功编译之后需要存在的文件(包括任何编译钩子)而不是erlang模块。这对于让rebar3找出是否成功构建了一些非Erlang工件的依赖项非常有用。其中可用的示例包括标识为共享库,渲染模板构建的C代码,或正确生成escript。
    2. 如果发现一个依赖已经被构建(意味着它的.app文件的模块列表匹配其.beam文件并且其所有工件已经存在),则在随后的rebar3运行期间将不会有编译提供者或其钩子被调用。
    3. {artifacts, [file:filename_all()]}.
    4. 路径是相对的,取决于它是否定义在一些项目的顶层。例如,如果我们有一个项目my_project,其中包含apps/my_app/下的项目应用程序my_app,我们构建一个escript,然后告诉rebar3不要在my_project/rebar.config中考虑项目"有效",因为它是项目顶层的rebar.config,工件将相对于profile_dir,默认情况下是_build/default/:
      1. {escript_name, rebar3}.
        {provider_hooks, [{post, [{compile, escriptize}]}]}.
        {artifacts, ["bin/rebar3"]}.
    5. 如果它不是一个顶层,但my_app是顶层目录,在rebar.config中定义的工件是相对于应用程序的输出目录,在这种情况下是_build/default/lib/my_app/,但我们可以使用一个模板来定义它来自profile_dir
      1. {escript_name, rebar3}.
        {provider_hooks, [{post, [{compile, escriptize}]}]}.
        {artifacts, ["{{profile_dir}}/bin/rebar3"]}.
    6. 在下表中列出了所有可用的模板键
      1. Template Key       Description
        1. profile_dir            The base output directory with the profile string appended, default: _build/default/.
        2. base_dir               The base output directory, default: _build.
        3. out_dir                 The application's output directory, default: _build/default/lib/<application>/.
    7. 另一个示例是在覆盖中使用工件,在本例中为eleveldb:
      1. {overrides,
         [{override, eleveldb, [{artifacts, ["priv/eleveldb.so"]},
                                ...
                               ]
          }]}.
      2. 工件实在应用程序eleveldb中定义的,因此它相对于输出目录,意味着上面使用的路径与使用"{{out_dir}}/priv/eleveldb.so"相同
  3. 编译
    1. 编译器选项可以使用erl_opts设置,可用的选项被列举在erlang编译模块的文档中。
      1. {erl_opts, []}
    2. 此外还可以设置平台特定的选项
      1. {erl_opts, [{platform_define,
                       "(linux|solaris|freebsd|darwin)",
                       'HAVE_SENDFILE'},
                      {platform_define, "(linux|freebsd)",
                        'BACKLOG', 128},
                      {platform_define, "R13",
                        'old_inets'}]
        }.
    3. 一个单独的选项可以设置一个模块编译在其他模块之前
      1. {erl_first_files, ["src/mymodule.erl", "src/mymodule.erl"]}.
    4. 还有一些其他的经常用到的选项
      1. {validate_app_modules, true}. % Make sure modules in .app match those found in code
        {app_vars_file, undefined | Path}. % file containing elements to put in all generated app files
        %% Paths the compiler outputs when reporting warnings or errors
        %% relative (default), build (all paths are in _build, default prior
        %% to 3.2.0, and absolute are valid options
        {compiler_source_format, relative}.
    5. 其他与erlang相关的编译器以及它们自己的配置选项
      1. Leex compiler with {xrl_opts, [...]}
      2. SNMP MIB Compiler with {mib_opts, [...]}
      3. Yecc compiler with {yrl_opts, [...]}
  4. 普通测试
    1. {ct_first_files, [...]}. % {erl_first_files, ...} but for CT
      {ct_opts, [...]}. % same as options for ct:run_test(...)
      {ct_readable, true | false}. % disable rebar3 modifying CT output in the shell
    2. ct_opts的常见测试选项的参考:http://www.erlang.org/doc/man/ct.html#run_test-1
  5. Cover
    1. 使用{cover_enabled, true}在测试中启用代码覆盖分析,然后cover提供了可以在测试之后显示报告的功能。选项{cover_opts, [verbose]}用于强制将覆盖报告打印到终端,而不仅仅打印到文件中。通过在配置文件中添加{cover_excl_mods, [Modules]},可以将特定模块从代码覆盖列入黑名单。应用程序可以使用{cover_excl_apps, [AppNames]}选项作为一个整体被列入黑名单。
  6. Dialyzer
    1. -type warning() :: no_return | no_unused | no_improper_lists | no_fun_app | no_match | no_opaque | no_fail_call | no_contracts | no_behaviours | no_undefined_callbacks | unmatched_returns | error_handling | race_conditions | overspecs | underspecs | specdiffs

      {dialyzer, [{warnings, [warning()]},
                  {get_warnings, boolean()},
                {plt_apps, top_level_deps | all_deps} % default: top_level_deps
                  {plt_extra_apps, [atom()]},
                  {plt_location, local | file:filename()},
                  {plt_prefix, string()},
                  {base_plt_apps, [atom(), ...]},
             {base_plt_location, global | file:filename()},
             {base_plt_prefix, string()}]}.
    2. 有关抑制模块中的警告信息,请参阅透析器文档中的请求或抑制文件中的警告的部分。
  7. Distribution
    1. 多个提供者和插件可能需要支持分布式erlang。通常,这样的所有命令(例如ct和shell)的配置都类似于一下配置值:
      1. {dist_node, [
            {setcookie, 'atom-cookie'},
            {name | sname, 'nodename'},
        ]}.
  8. Directories
    1. 目录有以下选项:下面的值是默认值
      1. %% directory for artifacts produced by rebar3
        {base_dir, "_build"}.
        %% directory in '<base_dir>/<profile>/' where deps go
        {deps_dir, "lib"}.
        %% where rebar3 operates from; defaults to the current working directory
        {root_dir, "."}.
        %% where checkout dependencies are to be located
        {checkouts_dir, "_checkouts"}.
        %% directory in '<base_dir>/<profile>/' where plugins go
        {plugins_dir, "plugins"}.
        %% directories where OTP applications for the project can be located
        {project_app_dirs, ["apps/*", "lib/*", "."]}.
        %% Directories where source files for an OTP application can be found
        {src_dirs, ["src"]}.
        %% Paths to miscellaneous Erlang files to compile for an app
        %% without including them in its modules list
        {extra_src_dirs, []}. 
        %% Paths the compiler outputs when reporting warnings or errors
        %% relative (default), build (all paths are in _build, default prior
        %% to 3.2.0, and absolute are valid options
        {compiler_source_format, relative}.
    2. 此外,rebar3将一些配置数据存储在~/.config/rebar3中,并且缓存一些数据到~/.cache/rebar3中。两者都可以通过指定{global_rebar_dir, "./some/path"}来覆盖。
  9. EDoc
    1. edoc支持的所有选项都可以放在{edoc_opts, [...]}。
  10. Escript
    1. 完整的详细信息在 escriptize命令中,例如下面的配置值。
    2. {escript_main_app, AppName}. % specify which app is the escript app
      {escript_name, "FinalName"}. % name of final generated escript
      {escript_incl_apps, [App]}. % apps (other than the main one and its deps) to be included
      {escript_emu_args, "%%! -escript main Module\n"}. % emulator args
      {escript_shebang, "#!/usr/bin/env escript\n"}. % executable line
      {escript_comment, "%%\n"}. % comment at top of escript file
    3. 由于escript构建的结构,顶级rebar.config文件中的选项只用于构建一个escript。
  11. EUnit
    1. {eunit_first_files, [...]}. % {erl_first_files, ...} but for CT
      {eunit_opts, [...]}. % same as options for eunit:test(Tests, ...)
      {eunit_tests, [...]}. % same as Tests argument in eunit:test(Tests, ...)
    2. EUnit选项引用: http://www.erlang.org/doc/man/eunit.html#test-2
  12. 最小OPT版本
    1. 可以指定Erlang/OTP的最低版本,如果使用早期版本构建应用程序,则会导致构建失败。
    2. {minimum_otp_vsn, "17.4"}.
  13. Overrides
    1. 覆盖允许从更高级别的应用程序修改依赖性的配置。它们旨在允许快速修复和解决办法,如果可能的话,我们建议致力于永久修复以使其成为目标应用程序的配置。
    2. 覆盖有3种风格:添加,覆盖应用程序和覆盖所有。
    3. {overrides, [{add, app_name(), [{atom(), any()}]},
                   {override, app_name(), [{atom(), any()}]},
                   {override, [{atom(), any()}]}]}.
    4. 有一些应用到依赖关系,依赖关系也可以具有它们应用的自己的覆盖。在所有的覆盖,每个应用程序覆盖按顺序添加。
    5. 例如,这可以用于强制所有的依赖关系在默认情况下使用debug_info编译,生产配置文件中强制使用no_debug_info。‘
    6. {overrides, [{override, [{erl_opts, [debug_info]}]}]}.
                   
      {profiles, [{prod, [{overrides, [{override, [{erl_opts,[no_debug_info]}]}]},
                          {relx, [{dev_mode, false},
                                  {include_erts, true}]}]}
                 ]}.
  14. Hooks
    1. 有两种类型的钩子:shell钩子和提供者钩子。它们都适用于提供者的相同类型。
    2. Shell Hooks
      1. 钩子提供了一种在hookable之前或之后运行任意命令的方法,随意的首先匹配系统类型选择运行哪个钩子,shell钩子在提供者钩子之后运行。
      2. -type hook() :: {atom(), string()}
                      | {string(), atom(), string()}.

        {pre_hooks, [hook()]}.
        {post_hooks, [hook()]}.
      3. 一个使用rebar3利用pre_hooks构建merl的例子:
        1. {pre_hooks, [{"(linux|darwin|solaris)", compile, "make -C \"$REBAR_DEPS_DIR/merl\" all -W test"},
                       {"(freebsd|netbsd|openbsd)", compile, "gmake -C \"$REBAR_DEPS_DIR/merl\" all"},
                       {"win32", compile, "make -C \"%REBAR_DEPS_DIR%/merl\" all -W test"},
                       {eunit, "erlc -I include/erlydtl_preparser.hrl -o test test/erlydtl_extension_testparser.yrl"},
                       {"(linux|darwin|solaris)", eunit, "make -C \"$REBAR_DEPS_DIR/merl\" test"},
                       {"(freebsd|netbsd|openbsd)", eunit, "gmake -C \"$REBAR_DEPS_DIR/merl\" test"},
                       {"win32", eunit, "make -C \"%REBAR_DEPS_DIR%/merl\" test"}
                      ]}.
    3. Provider Hooks
      1. 提供者也可以用作钩子。以下钩子在编译运行之前运行了clean。为了在命名空间中执行命令,使用一个元组作为第二个参数。提供者钩子在shell钩子之前运行。
      2. {provider_hooks, [{pre, [{compile, clean}]}
                          {post, [{compile, {erlydtl, compile}}]}]}
    4. 提供者的可挂钩点
      1. 只有特定的内置提供者支持附加到它们的钩子。控制取决于提供者是否操作项目的应用程序(每个应用程序和依赖项)或者是否期望它仅仅广泛的运行整个项目。
      2. 提供者钩子运行在shell钩子之前。
      3. Hook            before and after
        1. clean             each application and dependency, and/or before and after all top-level applications are compiled*
        2. ct                   the entire run
        3. compile         each application and dependency, and/or before and after all top-level applications are compiled*
        4. edoc              the entire run
        5. escriptize      the entire run
        6. eunit              the entire run
        7. release           the entire run
        8. tar                  the entire run
        9. erlc_compile  compilation of the beam files for an app
        10. app_compile  building of the .app file from .app.src for an app
      4. 默认情况下,这些钩子为每个程序运行,因为依赖关系可以在自己的上下文中指定自己的钩子。区别在于,某些情况下(不是顶层应用程序),钩子可以在许多级别上定义(省略覆盖)
        1. rebar.config位于应用程序根目录下
        2. 每个顶级应用程序(在apps/或者libs/)rebar.config
        3. 每个依赖项的rebar.condig
      5. 默认情况下,没有顶级应用程序时,在顶层rebar.config中定义的钩子被归属于顶层应用程序的一部分,这允许钩子在以后发布的时候继续为依赖程序工作。
      6. 然而,如果钩子在具有顶层应用程序的项目根目录的rebar.config中定义,钩子将在所有顶级应用程序的任务运行之前/之后运行。
      7. 要在一个顶级项目中保留每个应用程序的行为,必须在每个应用程序的rebar.config中定义钩子。
  15. Relx
    1. 请查看Releases
  16. Shell
    1. 如果找到relx条目,rebar3 shell REPL将自动引导应用程序
    2. 其他选项包括:
      1. Option          Value         Description
        1. apps          [app1, app2, ...]          Applications to be booted by the shell. Overtakes the relx entry values
        2. config        "path/to/a/file.config"           Loads a .config file (such as sys.config) for the applications to be booted by the shell.
        3. script_file          "path/to/a/file.escript"         Evaluates a given escript before booting the applications for a node.
  17. XRef
    1. {xref_warnings,false}.
      {xref_extra_paths,[]}.
      {xref_checks,[undefined_function_calls,undefined_functions,locals_not_used,
                    exports_not_used,deprecated_function_calls,
                    deprecated_functions]}.
      {xref_queries,[{"(xc - uc) || (xu - x - b - (\"mod\":\".*foo\"/\"4\"))", []}]}.

© 著作权归作者所有

共有 人打赏支持
易冥天
粉丝 30
博文 140
码字总数 70939
作品 0
海淀
程序员
私信 提问
rebar3的一些参考文档

刚使用rebar3,功能太多,各种命令不会用。网上找了一些资料: rebar3的官网,有指定的文档,命令例子都有,入门必备: rebar官网 然后使用流程介绍,这里介绍了一些使用案例和为什么这样做的...

格通
2016/03/25
50
0
EMQ X 3.0-rc.4 发布,改进日志与构建功能

EMQ X 3.0-rc.4版本发布,该版本改进日志功能,部分项目支持 `Rebar3` 构建 功能改进 为使用 `MQTT v3.1.1`的客户端提供避免 `loop delivery` 的功能 支持使用 `username` 代替 `client_id`,...

emqtt
11/26
468
0
为了方便发布tar,rebar3要适应relx迁移include目录到src目录

使用rebar3打tar包,十分方便。其中rebar3使用relx打包,relx里面有下面的选项,可以在打包的时候,不打包src目录,方便在发布的时候,不发布src里面的源码文件: 参考:relx Configuration ...

格通
2016/09/30
32
0
rebar3发布,归属权更新到erlang团队了

rebar3的beta 4发布很久了,一直奇怪为啥没有发布3.0稳定版。今天一看,不但发布了3.0 stable版本,而且github的地址也改了,由github.com/rebar/rebar3 改为 github.com/erlang/rebar3 了,...

格通
2016/03/15
52
0
rebar3使用relx打包了

rebar3: https://github.com/erlang/rebar3 relx: http://github.com/erlware/relx relflox: http://github.com/RJ/relflow rebar3不使用reltool了,转用relx了。 No ReltoolReltool is out......

格通
2016/03/23
69
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部