從 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.