rebar3文档翻译—配置
博客专区 > 影狼 的博客 > 博客详情
rebar3文档翻译—配置
影狼 发表于10个月前
rebar3文档翻译—配置
  • 发表于 10个月前
  • 阅读 156
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

  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\"))", []}]}.

共有 人打赏支持
粉丝 7
博文 71
码字总数 35397
×
影狼
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: