檢視原始碼 mix escript.build (Mix v1.16.2)
為專案建立 escript。
escript 是可從命令列呼叫的可執行檔。escript 可在已安裝 Erlang/OTP 的任何機器上執行,且預設不需要安裝 Elixir,因為 Elixir 已內嵌在 escript 中。
此任務保證專案及其相依性已編譯,並將它們封裝在 escript 中。在呼叫 mix escript.build
之前,只需在 mix.exs
檔案中定義一個具有 :main_module
選項的 :escript
鍵
escript: [main_module: MyApp.CLI]
escript 應作為開發人員之間分享指令碼的機制,而非部署機制。對於執行即時系統,請考慮使用 mix run
或建立版本。請參閱 Application
模組,以取得有關系統生命週期的更多資訊。
在 config/config.exs
中定義的所有設定都將包含在 escript 中。Elixir escript 也包含 config/runtime.exs
。載入設定後,此任務會啟動目前的應用程式。若不希望這樣,請將 :app
設定設為 nil。
此任務也會移除已編譯 .beam
檔案中的文件和除錯區塊,以縮小 escript 的大小。若不希望這樣,請查看 :strip_beams
選項。
priv
目錄支援escript 不支援需要從 priv 目錄儲存或讀取人工製品的專案和相依性。
命令列選項
預期與 mix compile
相同的命令列選項。
組態
下列選項必須在 mix.exs
中的 :escript
鍵下指定
:main_module
- escript 啟動後要呼叫的模組。模組中必須包含名為main/1
的函式,該函式會接收命令列引數。預設情況下,引數會以二進位元組清單提供,但如果專案組態為language: :erlang
,則會是字元清單清單。
其餘選項可指定以進一步自訂 escript
:name
- 已產生 escript 的名稱。預設為應用程式名稱。:path
- 要寫入 escript 的路徑。預設為應用程式名稱。:app
- 與 escript 一起啟動的應用程式。預設為應用程式名稱。如果沒有應用程式應該啟動,則將其設定為nil
。:strip_beams
- 如果為true
,則會移除 escript 中在執行階段不必要的區塊(例如偵錯資訊和文件)來移除 BEAM 程式碼。可以設定為[keep: ["Docs", "Dbgi"]]
,以移除區塊時保留某些區塊,例如文件和偵錯資訊。預設為true
。:embed_elixir
- 如果為true
,則會將 Elixir 及其在mix.exs
中application/0
函式中的:applications
清單中提到的子應用程式(ex_unit
、mix
等)嵌入。對於 Elixir 專案,預設為
true
,對於 Erlang 專案,預設為false
。注意:如果對 Elixir 專案設定為
false
,則在執行產生的 escript 時,必須將 Elixir 的ebin
目錄的路徑新增到ERL_LIBS
環境變數,才能讓程式碼載入器找到:elixir
應用程式及其子應用程式(如果使用的話)。:shebang
- 用於執行 escript 的 shebang 解譯器指令。預設為"#! /usr/bin/env escript\n"
。:comment
- 在 escript 中遵循 shebang 指令的註解行。預設為""
。:emu_args
- 要嵌入在 escript 檔案中的模擬器引數。預設為""
。
有一個專案層級選項會影響 escript 的產生方式
language: :elixir | :erlang
- 將其設定為:erlang
以適用於 Mix 管理的 Erlang 專案。這樣做可確保 Elixir 預設不會嵌入。您的應用程式仍會在 escript 載入時啟動,並使用建置期間所用的設定檔。
範例
在您的 mix.exs
defmodule MyApp.MixProject do
use Mix.Project
def project do
[
app: :my_app,
version: "0.0.1",
escript: escript()
]
end
def escript do
[main_module: MyApp.CLI]
end
end
然後定義進入點,例如在 lib/cli.ex
中的以下內容
defmodule MyApp.CLI do
def main(_args) do
IO.puts("Hello from MyApp!")
end
end