2021/11/22

rebar3

安裝

直接到 rebar release 下載 binary 執行檔,就可以使用。

Workflow

使用 rebar3 建議採用以下程序

選擇專案類型

template 類型 說明
escript short script or util 使用者需要自己安裝 erlang。
dependencies in C 可以直接包進專案,或是讓使用者自行安裝
release
umbrella
full, self-contained, executable system production deploy for erlang system
lib
app
library lib: stateless library that contain modules
app: stateful library with a supervision tree
umbrella collection of multiple libraries on form of project supported where multiple top-level apps are used

設定 dependencies

設定時要做兩件事

  1. track the rebar.lock file

    可以取得 repeatable builds,然後能在 switch branches 時,讓 rebar3 處理自動 re-update dependencies

  2. 忽略 _build 目錄

    可以直接刪除 _build 目錄,但不應該這樣做。rebar3 會追蹤所有 rebar.config 中宣告的 applications,但在發生奇怪的 bug 時,或是修改 project structure (例如移動 src 目錄),就可以直接刪除 _build

接下來就是 add dependencies

  1. 如果 dependency 是 needed at runtime (例如需要 web server 或是 要直接呼叫 library),就要新增到 application 的 .app.src{applications, [stdlib, kernel,...]} 裡面,這樣 erlang VM 就會知道如果沒有這些 dependencies,就無法 boot app
  2. 如果 dependency 是 needed for release (例如 observer or recon),類似 debugging tools,就要新增到 {release, ...} 裡面

更新 dependencies

  1. update the index cache
  2. update the dependency itself

rebar3 會保留一份 Hex.pm respository packages 的 cache,以及先前使用的 versions。但如果有了新版,rebar3 不會自動知道,故要下指令查詢

rebar3 update

這會更新 Hex packages,但不會修改既有的 project。要修改既有專案定義的方法,是修改 lock file,以下指令會修改 lock file 定義,在下次 build 時,會取得新版

rebar3 upgrade <depname>

要盡量避免刪除 lock file,可同時更新多個 app,如果沒有 app 參數,就是更新所有 applications

rebar3 upgrade app1,app2,app3

create aliases for common tasks

xref 是尋找 dead code

dialyzer 是 type analysis

ct 是 Common Test suites

cover 是 coverage analysis

可利用 alias 建立多個 tasks 的 simple command

{alias, [
    {check, [xref, dialyzer, edoc,
             {proper, "--regressions"},
             {proper, "-c"}, {ct, "-c"}, {cover, "-v --min_coverage=80"}]}
]}.

呼叫 rebar3 check,會依序處理

  1. xref 檢查是否有呼叫未定義的 functions
  2. dialyzer 檢查 inconsistencies and type errors
  3. 產生 edoc
  4. proper 執行 regression tests(使用 PropEr plugin)
  5. 在 compiling with coverage analysis 時,用 PropEr 執行 regular properties
  6. 在 compiling with coverage analysis 時,執行 Common Test test suites
  7. 執行 cover,將結果輸出到 shell

建議設定

隱藏太詳細的 report

{dialyzer, [
    {warnings, [
       %% Warn about undefined types and unknown functions
       unknown
    ]}
]}.

{xref_checks,[
    %% enable most checks, but avoid 'unused calls' which is often
    %% very verbose
    undefined_function_calls, undefined_functions, locals_not_used,
    deprecated_function_calls, deprecated_functions
]}.

{profiles, [
    {test, [
        %% Avoid warnings when test suites use `-compile(export_all)`
        {erl_opts, [nowarn_export_all]}
    ]}
]}.

References

rebar3 docs

eeeggghit rebar3

Erlang:Rebar3的简单使用

Automatic release upgrades in Erlang

relx

沒有留言:

張貼留言