從 Rebar 2.x 升級到 Rebar3

Rebar3 相較於 rebar 2.x 改變了不少東西。總體而言,Rebar3 嘗試在處理以純 Erlang 編寫的 OTP 應用程式時保持完全相容性。因此,建置或編寫標準 OTP 應用程式的人員將會看到很少不相容性,儘管仍然需要做一些準備工作。

主要變更包括(但不限於)將所有建置成品移動到 `_build`,以及更改提取相依性的方式。

純 Erlang,標準 OTP 應用程式

轉換應用程式的第一步是移除舊的成品目錄

  • 移除 `ebin/` 目錄。Rebar3 將會讀取並複製現有的 `ebin/` 目錄到它自己的 `_build/` 子目錄中,以便其他工具產生的 `.app` 和 `.beam` 檔案仍然可以使用。如果您使用 rebar 2.x,`ebin/` 是它放置成品的位置,這些成品將與 Rebar3 衝突。
  • 如果您使用 `relx`,請移除 `_rel/` 目錄。Relx 現在已整合到 Rebar3 中,並將其成品儲存在 `_build` 中。
  • 移除 `.rebar` 目錄。它不再被使用。
  • 移除 `deps/` 目錄;相依性現在位於 `_build` 中,這樣可以防止衝突。
  • 從 `.gitignore`、`.hgignore` 或其他任何地方移除這些項目。

清理完這些目錄後,可以稍微簡化 `rebar.config` 設定檔

  • 移除 `sub_dirs` 和 `lib_dirs` 項目,它們可能不再需要了;rebar3 會自動識別包含 Erlang 原始碼檔案和 OTP 應用程式的 `src/`、`apps/*` 和 `lib/*` 目錄。

然後,您應該檢查您的 `.app.src` 檔案,以確保遵守以下規定

  • 您所依賴的應用程式列在 `applications` 元組中
  • 沒有循環相依性
  • 提到以下欄位(以便與發行版本一起使用!):`description`、`vsn`、`registered`、`applications`、`env`

必要的目錄結構

Rebar3 僅明確處理發行版本和 OTP 應用程式。相依性應該只有 OTP 應用程式,每個項目一個。

確保您具有以下目錄結構之一

src/*.{erl,app.src}

這是一個單目錄、單應用程式的結構。它適用於 OTP 應用程式、OTP 發行版本和具有單個頂級應用程式的 escript。`src` 目錄會被遞迴搜尋,並且檔案會被視為位於頂層。

另一種形式是使用「傘型」結構

apps/app1/src/*.{erl,app.src}
apps/app2/src/*.{erl,app.src}
apps/app3/src/*.{erl,app.src}

lib/app1/src/*.{erl,app.src}
lib/app2/src/*.{erl,app.src}
lib/app3/src/*.{erl,app.src}

該格式將一次容納許多 OTP 應用程式,並且僅適用於發行版本和 escript,不適用於可用作相依性的 OTP 程式庫。

相依性處理

Rebar3 現在支援 Hex 套件和設定檔。因此,請考慮

  • 將您的相依性移至套件,請參閱相依性發佈套件
  • 將您的相依性(如 `meck` 和 `PropEr`)移至 `test` 設定檔,以便將它們從您的常規建置中移除。遺憾的是,您的相依性可能仍然包含它,因此它可能也仍然存在於預設建置中。
  • 您不再需要告訴 Rebar3 去提取相依性,它會在您告訴它編譯或執行測試時自動執行。

另請注意,Rebar3 不會在先前已編譯過相依性後再次編譯它們;如果您希望恢復該行為,請使用`_checkout` 相依性

Rebar3 也不再檢查或強制執行相依性版本,而是在發生衝突時使用「最接近根」的相依性選擇演算法。詳細資訊請參閱相依性

說到這裡,並且您的專案已準備就緒,文件中的任何 Rebar3 指南都應該易於理解和應用。

其他注意事項和編譯器

預設情況下,Rebar3 堅持使用 `erlc` 可用的編譯器:Erlang、yecc、MIB 等等。如果您有

  • **C 程式碼**,您將需要將程式碼移至 `Makefile`或使用port compiler 插件(與 rebar 2.x 向下相容)
  • 如果您使用 QuickCheck 或 PropEr,則必須使用其插件
  • **diameter** 有自己的插件
  • **erlydtl** 有自己的插件
  • 您在建置某些具有奇怪建置工具互動的程式庫時會遇到問題,尤其是 `edown` 和類似的程式庫。如果遇到這些問題,請前往 IRC 上的 #rebar 頻道,社群成員將會指出最簡單的解決方法。
  • 不再支援 **reltool** 發行版本,而是使用 Relx,並在發行版本中說明

其他

  • 如果您仍在使用 `Makefile` 建立捷徑指令,請考慮使用別名
  • 對於程式碼覆蓋率,您需要使用 `cover` 指令,例如 `rebar3 do eunit, cover`。有關更多詳細資訊,請參閱cover 文件。

使用 Hex 套件時維持向下相容性

如果您想在大多數情況下使用 Rebar3 設定和選項,並提供與 Rebar 2 使用者的向下相容性,請在`rebar.config.script`中新增類似以下內容,這將允許較舊的 Rebar 版本動態放棄 Hex 套件,並讓它們有機會包含現在是 Rebar3 中 `profiles` 一部分的內容

case erlang:function_exported(rebar3, main, 1) of
    true -> % rebar3
        CONFIG;
    false -> % rebar 2.x or older
        %% Rebuild deps, possibly including those that have been moved to
        %% profiles
        [{deps, [
            {my_dep, "VSN", {git, "https://...", {tag, "VSN"}}},
            ...
        ]} | lists:keydelete(deps, 1, CONFIG)]
end.
上次修改時間:2021 年 5 月 6 日:審閱所有與語言相關的元素 (511cdb9)