設定檔腳本
使用 rebar.config
和 *.app.src
,您可以利用基於 file:script/2 的動態設定。
如果在原始檔案相同的目錄中存在 <name>.script
(在 rebar.config
的情況下,它會是 rebar.config.script
),腳本檔案將會被評估,並將結果用作設定。
為了方便起見,在評估期間,腳本中可以使用兩個綁定(變數)
CONFIG
- 如果正在評估的腳本檔案也存在(沒有.script
副檔名),則為 file:consult/1 的結果。否則為[]
。
SCRIPT
- 正在評估的腳本的檔案名稱
在所有情況下,腳本返回的數據(即檔案中最後評估的內容)必須與原始非腳本檔案格式相同的數據。例如,如果我有一個 rebar.config.script
,該腳本必須返回 Rebar3 設定數據;如果它是 <app-name>.app.src.script
,它必須返回應用程式中繼數據格式的數據。
每個腳本在每次 Rebar3 執行中可能會執行多次。避免使用非 冪等 副作用的腳本是一個好主意。
簡單範例
如果您正在建置相當複雜的系統,每次都去 GitHub 抓取依賴項會減慢您的開發週期。在本地提供依賴項可能會快得多,但您不希望修改 rebar.config
並因此導致合併衝突。
以下 rebar.config.script
檔案可以集中存放,並連結到您的應用程式目錄中
case os:getenv("REBAR_DEPS") of
false -> CONFIG; % env var not defined
[] -> CONFIG; % env var set to empty string
Dir ->
lists:keystore(deps_dir, 1, CONFIG, {deps_dir, Dir})
end.
當您想要「正確地」建置時(您應該定期這樣做),只需呼叫 unset REBAR_DEPS
(或等效指令),然後執行全新建置。
請注意,file:script/2
與 file:consult/1
的不同之處在於,它只返回最後一個表達式的結果。因此,您必須注意返回設定項列表。在此之前,您可以執行任何形式的 I/O(包括網路)、檢查作業系統環境變數、讀取檔案(可能在其他檔案上呼叫 file:script/2
)或寫入檔案。您基本上可以使用所有 OTP 函式庫。與 file:eval/2
中一樣,每個表達式都以句點結尾。