工作流程

各種任務的建議步驟和可能的預設設定。

如果您了解基本指令,已閱讀 開始使用基本用法,並且對 發行版本 有初步的了解,那麼下一步可能就是為您的專案和團隊規劃工作流程。

本節正在彙整各種任務的建議步驟和可能的預設設定,以便您在使用 Erlang 工具鏈時獲得良好的體驗。

選擇正確的專案類型

專案類型 建議範本 備註
簡短腳本或工具程式 escript 您發佈此程式的使用者需要安裝 Erlang。

C 語言的相依性不容易包含或重新發佈
完整的、自包含的、可執行的系統 release 或 umbrella 這是 Erlang 系統建議的生產環境部署方式。

有關發行版本的更多詳細資訊,請參閱 發行版本 章節
要在其他系統中使用的程式庫 lib 或 app 使用 lib 表示包含模組的無狀態程式庫,使用 app 表示具有監督樹的狀態程式庫
多個程式庫的集合 umbrella 這是唯一支援使用多個頂層應用程式的專案形式。

這些專案通常不能用作相依性。
對於可用作相依性的專案,請參閱 如何宣告 git_subdir 相依性

設定相依性

專案的基本設定至少應包含兩項

  1. 始終追蹤 rebar.lock 檔案

  2. 忽略 _build 目錄

追蹤鎖定檔案可讓您進行可重複的建置,並允許 Rebar3 在切換分支時自動重新更新相依性。

🚧

刪除 `_build` 目錄應該是安全的,但您不應該需要這樣做

Rebar3 會追蹤 `rebar.config` 檔案中宣告的所有應用程式,並且應該能夠追蹤所有必要的變更。在某些情況下,這是不可能的,並且可能導致奇怪的錯誤,尤其是在您更改專案結構時。如果您要從單應用程式專案遷移到 umbrella 專案(即所有原始程式檔從 `src/` 移動到 `apps/myapp/src`)或相反的情況,`_build` 目錄中的各種構件可能會相互衝突。在這種情況下,請將其刪除並要求重新建置。

接下來您要做的是將相依性新增到您的專案中。請參閱 相依性 章節。然而,新增相依性並不會自動將它們整合到您的專案中。

{deps, [...]} 設定值會告訴 Rebar3 要提取、下載和追蹤哪些相依性,但僅此而已。然後,您必須設定您的應用程式以使用相依性

  • 如果您的應用程式在執行時需要相依性才能正常工作(例如,您需要 Web 伺服器或直接呼叫程式庫),請將其新增到應用程式的 .app.src 檔案中的 {applications, [stdlib, kernel, ...]} 元組下。這將讓 Erlang VM 知道在沒有相依性的情況下不要啟動您的應用程式
  • 如果僅發行版本需要相依性(例如,observerrecon,它們是您的應用程式可能不依賴但您希望將其捆綁在一起的除錯工具),那麼您需要將該應用程式明確新增到 {releases, ...} 設定元組。該元組上的任何相依性也將包含其遞移相依性。

其他建置工具往往不會區分這些類型的專案包含,但 Rebar3 嘗試嚴格區分應該包含或不包含的內容。它可以讓您進行特定建置,例如 escripts 或測試發行版本,這些版本不需要特定的工具鏈(如 Wx 圖形工具包)即可執行。

升級相依性

升級相依性需要兩個步驟

  1. 更新索引快取

  2. 更新相依性本身

第一步是必需的,因為 Rebar3 會保留您先前提取的 Hex.pm 儲存庫套件和版本的快取。當您的電腦上存在所有已知和必要的版本時,這可以讓建置工具更快地執行,而無需對網路進行無用的呼叫。但是,當存在新版本時,Rebar3 不會自動知道。要告訴它去提取已知套件的新版本定義,請呼叫

$ rebar3 update

rebar3 update

這將更新 Hex 套件,但不會修改現有專案。.

$ rebar3 upgrade <depname>

更改現有專案定義的唯一方法是修改鎖定檔案。這可以透過呼叫輕鬆完成

rebar3 upgrade

為常用任務建立別名

這將更新鎖定檔案定義,並且在下一次建置時,將提取和編譯新的副本。如果遞移相依性也已升級,則將會偵測到並處理。.

您應盡可能避免刪除鎖定檔案,如果需要升級多個相依性,可以呼叫 `rebar3 upgrade dep1,dep2,dep3`。如果要更新所有相依性,請呼叫 `rebar3 upgrade --all`,這在小型專案上是可以的,但在大型專案上,您可能希望逐步進行。.

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

更複雜的專案可能會執行多個工具。例如,您可能想要執行 `xref` 來查找無效程式碼,`dialyzer` 進行類型分析,`ct` 進行 Common Test 套件,`cover` 進行覆蓋率分析等等。.

  • 與其手動呼叫所有任務,不如使用別名建立一個簡單的指令來執行多個任務
  • ```erlang
  • 此設定將允許呼叫 `rebar3 check`,它將按順序執行以下操作
  • `xref` 分析無效程式碼和對不存在的函數的呼叫
  • `dialyzer` 檢查不一致和類型錯誤
  • 建置專案文件,以確保它可以毫無錯誤地執行
  • 在 `proper` 中執行迴歸測試(使用 PropEr 插件

在使用覆蓋率分析進行編譯時,在 PropEr 中執行常規屬性

在使用覆蓋率分析進行編譯時,執行 Common Test 測試套件

執行 `cover` 分析,將結果輸出到 shell。此別名還確保如果程式碼覆蓋率低於 80%,則指令將失敗

一旦任務失敗,整個指令就會中斷。您可以根據需要調整別名。.

📘

最佳化任務延遲

{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]}
    ]}
]}.
節省時間的一個技巧是先執行短任務。例如,`xref` 會發現一些 `dialyzer` 也會發現的問題,但速度要快得多。在別名中先執行 `xref` 再執行 Dialyzer 將為您提供更快的回饋迴圈。.