檢視原始碼 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.exsapplication/0 函式中的 :applications 清單中提到的子應用程式(ex_unitmix 等)嵌入。

    對於 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