如果不安裝 Erlang,您無法撰寫 Erlang,因此,本章節涵蓋的第一步一點也不令人意外,那就是執行基本步驟,在大部分主流平台上安裝 Erlang/OTP。說明書旨在於大部分平台上提供基本的設定,但是,您會發現實際的 Erlang 開發很少只會使用這些基本說明。
事實上,隨著團隊成長以及累積各項專案,某些服務、程式庫或程式碼片段可能無法支援完全相同的 Erlang 版本,而且無法一次同時升級。如果您與專業的 Erlang 開發人員交談,大部分的人(除了 Windows 使用者以外)會告訴您,他們會編譯自己的副本,並使用所需的選項,以及允許多種版本切換的工具。因此,我們將會說明如何做。
您還將看到如何安裝 Rebar3,此為 Erlang 社群的官方建置工具,以及各種文字編輯器的基本設定。在後續章節中,我們還將討論其他不限定於 Erlang 的工具,例如 Kubernetes 或 Prometheus,但讓我們從單純的 Erlang 開始。
安裝 Erlang/OTP
第一步是要妥善安裝 Erlang/OTP。這並非在所有平台上都會是標準的體驗,但我們至少會確保遵循這些步驟的每個人都能針對任何工作環境擁有運作正常的設定。
選擇版本
Erlang/OTP 發布時間表穩定且預測性高,後向不相容變更也有明確的定義準則。
根據 Erlang/OTP 系統原則中所述,Erlang 版本以 <主版本>.<次要版本>.<修補程式>
的架構編號。在某些罕見情況下,會附加其他數字為「分支」版本,您可能不需要特別關注。
以下是部分可能的版本範例
- 22.0
- 22.0-rc3
- 21.3
- 21.2.3
- 21.1
- 19.3
- 17.0
- R16B03(此為自 2014 年起未再使用的傳統版本格式)
如您所見,在不需要修補程式時,不會提及 修補程式
版本。Erlang 的發行時程表大致如下
- 每年約 2 或 3 月時,會公布下一主要版本的候選版本(字尾為
-rc1
或-rc2
)。此候選版本提供給想要從原始碼建置的使用者,以測試他們的應用程式與系統是否能順利運作 - 幾個月後(4 至 6 月),主要版本會建置完成並公開發布。主要版本包含大型新功能,需要進行較大的虛擬機器變更,以及可能引進向後不相容的變更
- 每三或四個月發布一次次要版本,通常包含個別函式庫的穩定性修正和次要功能新增
- 如果在特定情況下發現到重大錯誤(安全或穩定性因素),可能會公布補丁版本。
資訊
向後不相容變更通常會在移除前經過一段淘汰週期,通常會預留充裕的時間進行調整。此政策說明於愛立信 OTP 團隊發布的 支援、相容性、淘汰和移除 文件中。
在少數罕見情況下,會發生立即且固定的淘汰(大多數情況下是意外),社群可能需要花幾週時間提出解決方法。
因此,採用 Erlang 的團隊可能會想要採用符合主要版本的維護排程,以避免落後太多。雖然可以偶爾才升級,你會發現,一次執行大量維護不如時不時進行一些維護容易許多。
請注意,補丁等級的版本通常只會在 郵件清單 中公布並標記於 GitHub 上的主 git 儲存庫 中,但其他部分並不會封裝在主網站中。
Windows
如果您是 Windows 使用者,建議您使用 Windows 10 進行任何 Erlang 開發。先前版本也可以運作,但社群工具(例如 Rebar3)只針對 Windows 10 進行測試。
從原始碼在 Windows 上建置向來困難,因此建議您使用預先建置的副本。
如果您是 Chocolatey 使用者,您可以取得 Erlang 套件,並根據您的喜好安裝,使用下列指令:
choco install erlang # for the latest
choco install erlang --version 21.2 -m # allow many versions
choco install erlang --version 20.1 -m # and one more versions
這將把您要的所有版本新增到您的 PATH
變數,然後您需要把它們維護在正確的順序。
如果您沒有使用 Chocolatey,可以使用發布於 www.erlang.org/downloads 的二進位檔,或者也可以使用 Erlang Solutions Ltd. 建置的二進位檔。
這些版本的安裝程式附有精靈,將引導您完成所有必要的步驟。
別忘了將 Erlang/OTP 新增到您的 PATH
變數,以包含您的 Erlang/OTP 安裝,因為這樣您就能從命令列呼叫它
- 在啟動選單搜尋「系統環境變數」,選擇「編輯系統和環境變數(控制台)」選項
- 在剛開啟的「系統屬性」視窗下方按下「環境變數…」按鈕
- 選擇
Path
變數(若不存在就建立一個),按下「編輯」按鈕 - 為 Erlang/OTP 增加一個符合安裝路徑的項目,通常就像
C:\Program Files\erl10.2\bin
這樣。較早加入清單的項目會優先載入。 - 儲存選項
- 關閉並重新啟動任何正在執行的終端機。
如果你要長期開發,這樣做就能安裝多個版本。你可以透過調整和修改 PATH
變數在路徑中的優先順序來控制使用哪個版本。
如果你對於 Windows 開發很講究,你可能會在 Visual Studio 等環境中很自在,在裡頭幾乎所有事情都可以用 IDE 完成。但 Erlang 來自不同的環境,我們在這本書中會用許多指令專注於使用命令列來建構所有內容。
如果你要找一個終端機讓 Windows 上的命令列可以執行,有各種選項可用
- 以 PowerShell 作為終端機。本書中大多數指令都可以在 PowerShell 中順利執行,但也可能存在一些極端情況。
- 下載並安裝 Windows 版 Git,其中會附帶一個
git-bash
shell,它可以和本書中的所有工具和大多數指令順利運作 - 試試 ConEmu 作為一個好用的終端機模擬器
- 使用 Cmder,一個整理打包上述大多數選項的 Windows 主控台模擬器
- 自行斟酌是否要使用 Cygwin;你需要從原始碼重建你的軟體才能順利使用,而 Rebar3 等工具會動態偵測它們在 Windows 中,這在過去和 Cygwin 互動時會導致一些路徑問題
然後你可以使用你選擇的編輯器或 IDE 來處理 Erlang 元件。
OSX
OSX 可以用 Homebrew 或 Erlang Solutions Ltd. 套件 安裝 Erlang/OTP 預建構版本,但你只應該在第一次試用時使用這些方式。如果你計畫進行較長時間的實際開發,你需要一次處理多個版本。
最常支援這個功能的工具是 kerl。Kerl 是一個用來在單一系統下載、編譯和載入各種 Erlang/OTP 版本的包裝器,可以抽象化多數麻煩的操作。
你可以透過呼叫 $ brew install kerl
或者遵循其 README 文件中的說明,從 homebrew 安裝 kerl。
在安裝 Erlang 之前,我們需要先安裝並更新一些相依性,其中最重要的一點是確保您的電腦有安裝 XCode,以及安裝 OpenSSL(因為 OSX 內建的 SSL 版本過於老舊)
$ brew install openssl
...
$ ls /usr/local/Cellar/openssl/
1.0.2q
請注意這會給您本機 openssl 安裝的完整路徑,此處為 /usr/local/Cellar/openssl/1.0.2q/
您可以在自己的環境中設定下列選項
SSL_PATH=/usr/local/Cellar/openssl/1.0.2q/
export KERL_BUILD_BACKEND="git"
export KERL_CONFIGURE_OPTIONS="--without-javac \
--with-dynamic-trace=dtrace \
--with-ssl=${SSL_PATH}"
並確保其已啟用(例如,呼叫 source ~/.bashrc
)。這些選項會指定建置工具接受或預期的設定。此處的選項會停用 Java 繫結,並使用我們剛才安裝的全新 SSL。您可以參閱 建置說明,以取得更多組態選項。
如果您想要加入更多內容,例如 Wx
(讓您可以使用並建置 GUI),則 針對 OSX 的建置說明 提供了進一步的詳細資訊,以協助您進行作業。
從那個時間點開始,您可以下載並安裝自己的 Erlang/OTP 版本
$ kerl update releases
...
# kerl build <release> <build name>
$ kerl build 21.3 21.3
...
# kerl install <build name> <target path>
$ kerl install 21.3 ~/bin/erls/21.3/
...
# make that version active
$ . ~/bin/erls/21.3/activate
# or alternatively
$ source ~/bin/erls/21.3/activate
接著再隨選啟用任何已安裝的版本即可。如果您想要設定預設版本,您可以在 .bashrc
組態檔案(或您可能有的任何 shell 設定檔)中加入啟用指令。
如果您打算在開發機器上同時使用 Erlang 和 Elixir,建議您看看 asdf
。這是一個針對多種程式語言的基於外掛程式的安裝程式,並且能夠一次處理 Elixir 和 Erlang。您可能需要安裝 autoconf
套件才能讓它正常運作。
要將它與 Erlang 搭配使用,請呼叫 asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
來安裝 Erlang 外掛程式。這個外掛程式會包裝 kerl
並重複使用其所有選項,但會將建置轉移至 asdf
的控制之下。因此,前述的組態說明仍然相同。您只需要變更呼叫順序,改為
# asdf install erlang <version>
$ asdf install erlang 21.3
...
# asdf global <name> <version> [<version>...]
# asdf local <name> <version> [<version>...]
# export ASDF_ERLANG_VERSION=<version>
從此之後,kerl
和 asdf
之間的主要差別是 kerl
會使用環境變數來判斷要執行哪個版本,而 asdf
則會選擇性使用 .tool-versions
檔案,以根據每個目錄觸發變更。
Linux
絕大多數 Linux 發行版都有軟體套件管理員,讓你可以安裝 Erlang 的預先建置版本,或者你還是可以使用 Erlang Solutions Ltd. 的套件。不過就如同 OSX 一樣,您只應該在第一次試用時這麼做。如果您打算要持續進行實際開發,您會想要同時處理多個版本。
最常支援這個功能的工具是 kerl。Kerl 是一個用來在單一系統下載、編譯和載入各種 Erlang/OTP 版本的包裝器,可以抽象化多數麻煩的操作。
您可以透過呼叫以下指令來安裝 kerl
$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
$ chmod a+x kerl
接著將 kerl 移到您的路徑。在建置函式庫時,Kerl 會自動檢查並警告您缺少的依賴項,因此您只要繼續執行下列命令,並在執行時留意其指示。
首先,您可以在您的環境中設定選項如下
export KERL_BUILD_BACKEND="git"
export KERL_CONFIGURE_OPTIONS="--without-javac \
--with-dynamic-trace=systemtap"
並確保它已啟用(例如,呼叫 source ~/.bashrc
)。這些選項會指出建置工具可以接受或預期的內容。此選項會停用 Java 繫結,但它們會自動略過。您可以在 建置說明 中查看更多設定選項。
如果您想要新增更多內容,例如Wx(讓您使用和建置 GUI),Wx 的建置說明 包含更多詳細資訊來引導您。
從那個時間點開始,您可以下載並安裝自己的 Erlang/OTP 版本
$ kerl update releases
...
# kerl build <release> <build name>
$ kerl build 21.3 21.3
...
# kerl install <build name> <target path>
$ kerl install 21.3 ~/bin/erls/21.3/
...
# make that version active
$ . ~/bin/erls/21.3/activate
# or alternatively
$ source ~/bin/erls/21.3/activate
接著再隨選啟用任何已安裝的版本即可。如果您想要設定預設版本,您可以在 .bashrc
組態檔案(或您可能有的任何 shell 設定檔)中加入啟用指令。
如果您打算在開發機器上同時使用 Erlang 和 Elixir,建議您看看 asdf
。這是一個針對多種程式語言的基於外掛程式的安裝程式,並且能夠一次處理 Elixir 和 Erlang。您可能需要安裝 autoconf
套件才能讓它正常運作。
要將它與 Erlang 搭配使用,請呼叫 asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
來安裝 Erlang 外掛程式。這個外掛程式會包裝 kerl
並重複使用其所有選項,但會將建置轉移至 asdf
的控制之下。因此,前述的組態說明仍然相同。您只需要變更呼叫順序,改為
# asdf install erlang <version>
$ asdf install erlang 21.3
...
# asdf global <name> <version> [<version>...]
# asdf local <name> <version> [<version>...]
# export ASDF_ERLANG_VERSION=<version>
從此之後,kerl
和 asdf
之間的主要差別是 kerl
會使用環境變數來判斷要執行哪個版本,而 asdf
則會選擇性使用 .tool-versions
檔案,以根據每個目錄觸發變更。
FreeBSD
針對 FreeBSD,使用 kerl
的經驗(如其他章節所述)時好時壞。有時候,需要一些修補程式才能像在其他平台上一樣順利運作。好消息是,如果您使用 BSD port 或 套件,一開始便可順利運作。
這是最簡單的方法,但是因為您沒有免費取得 Erlang 版本管理員,這可能會讓版本切換有點棘手。然而,BSD por 和套件確實讓您可以依自己的喜好建置所有支援版本。
例如您可以呼叫以下任何一項
# pkg install erlang # default copy
# pkg install erlang-runtime20 # OTP-20.x
# ls /usr/ports/lang/erlang* # source install: pick the version directory
erlang/
...
erlang-runtime20/
erlang-runtime21/
erlang-wx/
# cd /usr/ports/lang/erlang-runtime21/
# make config-recursive # configure all the deps
# make install
基本上 FreeBSD 維護人員會確保所有內容順利運作於主要的支援架構上,因此如果您堅持使用 x86 並避免 ARM,您遇到重大問題的機率不高。
一切都變得簡單了
在完成作業之前,您應該前往您的 shell 或終端機設定檔,並新增幾個環境變數。確切來說,您可以使用 ERL_AFLAGS
或 ERL_ZFLAGS
隨時為 erl
可執行檔新增組態變數。
我們將使用 ERL_AFLAGS
啟用兩個漂亮的功能:預設輸出含有 Unicode 支援的字串,以及啟用 shell 記錄,這樣 Erlang shell 便會在呼叫期間記住您的命令。將下列內容新增到您的環境
export ERL_AFLAGS="+pc unicode -kernel shell_history enabled"
這樣事情會感覺現代化許多。
安裝 Rebar3
Rebar3 是 Erlang 社群中的標準建置工具。它基本上將所有與 Erlang 一起運送的其他工具與一些開源工具捆綁在一起,並讓它們全部在統一的專案結構下運作。
有幾種方法可以安裝 Rebar3:從預先建置的二進位檔或從來源安裝,然後對快速執行本機安裝有一個最後的變體。請注意,在所有情況下,您都需要事先安裝 Erlang。
預先建置的二進位檔
於 www.rebar3.org 可找到預建二進檔。會有具有最新穩定版本的「下載」大按鈕,但如果您喜歡冒險,也可以取得 最新 每日版 組建。
通常會建立一個用於配置命令列工具的 ~/bin/
目錄,例如 rebar3
,這也是您可能想要放置剛下載的版本之處。呼叫 chmod +x rebar3
對其進行權限設定以確定其可以執行,並在您的 ~/.bashrc
、~/.zshrc
或同等文件中,使用 export PATH=~/bin/:$PATH
將其加入路徑。
想在 PowerShell 或 cmd.exe (而非終端機模擬器)中使用程式碼的 Windows 使用者,必須確定已新增 rebar3.cmd
檔案
@echo off
setlocal
set rebarscript=%~f0
escript.exe "%rebarscript:.cmd=%" %*
從原始碼組建
首先確定您已安裝 git,並檢出儲存庫以進行組建
$ git clone https://github.com/erlang/rebar3.git
$ cd rebar3
$ ./bootstrap
此將會於 Windows 上建立一個 rebar3
程式檔(以及一個 rebar3.cmd
檔案)。
本機安裝
本機安裝表單會讓您可以取得任何先前組建的 Rebar3 版本,並將其解壓縮到本機目錄,該工具稍後可以從中進行自我更新
$ ./rebar3 local install # starting from a rebar3 not in PATH
===> Extracting rebar3 libs to ~/.cache/rebar3/lib...
===> Writing rebar3 run script ~/.cache/rebar3/bin/rebar3...
===> Add to $PATH for use: export PATH=$PATH:~/.cache/rebar3/bin
$ export PATH=$PATH:~/.cache/rebar3/bin
$ rebar3 local upgrade # this can be used to update to the latest stable copy
...
配置編輯器
編輯器非特定(經由語言伺服器)
語言伺服器 是一種編輯器非特定解決方案,可提供語言功能,例如程式碼完成、跳至定義和內嵌診斷。Erlang LS 語言伺服器為 Erlang 程式語言實作這些功能。它整合於 Emacs、VS Code、Sublime Text 3、Vim 與更多符合 LSP 協定 的文字編輯器和 IDE。
如需使用特定文字編輯器來啟動 Erlang LS,請參閱 說明文件 的「編輯器」區段。
Visual Studio Code
建議使用 Pierrick Gourlain 的 Erlang 擴充功能。
如需配置擴充功能,請前往 喜好設定
,然後再前往 設定
功能表。於 VS Code 視窗中,展開 擴充功能
功能表,直至 erlang 組態
區段。確定所有數值都正確,特別是 Erlang 路徑和 Rebar3 路徑。如此一來,您可以混合並搭配其他您想要的擴充功能,應已準備好開始作業。
程式碼格式器可能感覺有點不穩定;它遵循 Erlang 官方儲存庫關於混合使用 tab 和空白的舊常規,並期望每個 tab 寬 8 個空白。這並未在其他地方使用,而且如果您的 Visual Studio Code 未設定成這樣(例如使用 4 個空白),它只會看起來怪怪的。
否則,該擴充套件會涵蓋所有主要功能:跳轉程式碼定義、建立工具支援(儘管命令面板中僅支援 compile
、eunit
和 dialyzer
,但您仍可直接從終端機呼叫 rebar3
)、Intellisense、輸入時警告以及 CodeLens 功能。查看擴充套件的文件時,您還可以找到除錯器支援說明。
接下來您需要做的就是根據喜好配置佈景主題和更多擴充套件。
Emacs
Erlang/OTP 附帶 tools
應用程式中的 Emacs 模式 lib/tools/emacs/
。使用 Emacs 的本書作者保持使用這個模式,讓 Emacs 直接從安裝的最新 Erlang 版本載入。還有許多選項可以提供其他模式和附加元件以支援 erlang-mode
中更炫的功能,在這裡我們只會討論 Ivy 自動完成和 Flycheck 語法檢查。但首先我們需要 use-package,一種用於隔離套件設定的工具。自動安裝 use-package
的程式碼可以在 此處找到。將該程式碼放入 `~/.emacs.d/init.el` 中,這樣就能在啟動時安裝 `use-package`。或使用 `use-package` 網站上的 安裝說明。
可以使用下列 `elisp` 程式碼片段來設定只有 `erlang-mode`(不含 Ivy 或 Flycheck),並讓它為 Rebar3、Relx 和其他 Erlang 設定檔載入
(use-package erlang
:load-path ("<PATH TO OTP>/lib/erlang/lib/tools-3.0/emacs/")
:mode (("\\.erl?$" . erlang-mode)
("rebar\\.config$" . erlang-mode)
("relx\\.config$" . erlang-mode)
("sys\\.config\\.src$" . erlang-mode)
("sys\\.config$" . erlang-mode)
("\\.config\\.src?$" . erlang-mode)
("\\.config\\.script?$" . erlang-mode)
("\\.hrl?$" . erlang-mode)
("\\.app?$" . erlang-mode)
("\\.app.src?$" . erlang-mode)
("\\Emakefile" . erlang-mode)))
若要使用 Ivy 來取得自動完成支援,請新增 `ivy-erlang-complete` 套件,為它設定自訂 Erlang 根目錄,在設定 Erlang 模式時執行其 `init`
(use-package ivy-erlang-complete
:ensure t)
(use-package erlang
:load-path ("<PATH TO OTP>/lib/erlang/lib/tools-3.0/emacs/")
:hook (after-save . ivy-erlang-complete-reparse)
:custom (ivy-erlang-complete-erlang-root "<PATH TO OTP>/lib/erlang/")
:config (ivy-erlang-complete-init)
:mode (("\\.erl?$" . erlang-mode)
("rebar\\.config$" . erlang-mode)
("relx\\.config$" . erlang-mode)
("sys\\.config\\.src$" . erlang-mode)
("sys\\.config$" . erlang-mode)
("\\.config\\.src?$" . erlang-mode)
("\\.config\\.script?$" . erlang-mode)
("\\.hrl?$" . erlang-mode)
("\\.app?$" . erlang-mode)
("\\.app.src?$" . erlang-mode)
("\\Emakefile" . erlang-mode)))
Flycheck 內建支援 Rebar3,可以自動偵測 Rebar3 專案,因此只需要 `flycheck` 套件
(use-package delight
:ensure t)
(use-package flycheck
:ensure t
:delight
:config (global-flycheck-mode))
給定 use-package
的 :config (global-flycheck-mode)
引數會為您在 Emacs 中編輯的所有程式碼啟用 Flycheck,使用 :config
給出的表達式會在載入套件後執行。:delight
引數告知 use-package
使用 delight
公用程式以停用模式列中顯示 Flycheck。將它排除在模式列外可以節省空間,而且由於已在全球範圍內啟用,我們不需要它在模式列中標示為目前已啟用。
如果您喜歡使用 Flycheck,那麼 hydra 值得一試,可以用它逐一檢閱並查看完整錯誤清單。Hydra 巨集會設定只有在執行初始 Hydra 繫結時才會運作的快速鍵繫結。以下程式碼會在呼叫 C-c f
時設定檢視 Flycheck 錯誤的基本繫結
(use-package hydra
:defer 2
:bind ("C-c f" . hydra-flycheck/body))
(defhydra hydra-flycheck (:color blue)
"
^
^Errors^
^──────^
_<_ previous
_>_ next
_l_ list
_q_ quit
^^
"
("q" nil)
("<" flycheck-previous-error :color pink)
(">" flycheck-next-error :color pink)
("l" flycheck-list-errors))
最後,有兩個套件雖非特別針對 Erlang,但值得特別提出,在執行專案開發時非常有用
- magit: Emacs 界面的 Git. Magit 不僅允許從 Emacs 呼叫 Git,而且提供了一個簡化的界面,可處理從暫存變更到互動變基的所有內容。
counsel-rg
: counsel 是一個命令集合,利用 Ivy,我們前面用於 Erlang 完成的套件。counsel-rg
使用 ripgrep 在專案中的檔案中搜尋字串 - 當在 git 專案中時,它們像git grep
那樣,僅在 git 回應資料庫中的檔案中搜尋,並遵循.gitignore
。由於 ripgrep 是外部命令,因此必須另外安裝,例如在 Ubuntu 或 Debian 上執行sudo apt-get install ripgrep
。當安裝ripgrep
時,ivy-erlang-complete
也會使用它來加快搜尋。- swiper: 在緩衝區中使用 Ivy 搜尋的
isearch
替代方案。 - company-mode: 當通過 company-erlang 與
ivy-erlang-complete
結合使用時,此模式將自動提供一個完成視窗,而不是需要在小緩衝區中輸入C-:
來顯示完成。 - flycheck-inline, flycheck-pos-tip 或 flycheck-popup-tip: 這些套件提供了不同的選項,用以在錯誤位置而不是在小緩衝區中顯示 Flycheck 錯誤。
Vim
儘管在 Vim 中可以對 Erlang 進行絕對新潮的支持,但正如 Github 上的 vim-erlang 組 所允許的那樣,使用 Vim 的本書作者傾向於堅持使用最小的必要設定。
在 .vimrc
檔案中只使用預設語法突顯顯示,並確保在所有正確的檔案類型中都使用它。
"also erlang
autocmd BufRead,BufNewFile *.erl,*.es.*.hrl,*.xrl,*.config setlocal expandtab noautoindent
au BufNewFile,BufRead *.erl,*.es,*.hrl,*.xrl,*.config setf erlang
顯然,這些都是非常基本的內容。可以進行更高級的整合,但主要使用 vim 的一位作者只使用這個,並依賴於終端機中的 Rebar3 來處理語言的其餘部分。