跳至主內容

dart compile

本指南介紹瞭如何使用 dart compile 命令將 Dart 程式編譯到目標平臺。

概覽

#

使用 dart compile 命令將 Dart 程式編譯到目標平臺。您透過子命令指定的輸出可以包含 Dart 執行時,也可以是模組(也稱為快照)。

這是一個使用 exe 子命令生成獨立可執行檔案 (myapp.exe) 的示例

dart compile exe bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.exe

下一個示例使用 aot-snapshot 子命令生成預先 (AOT) 編譯的模組 (myapp.aot)。然後它使用dartaotruntime 命令(提供 Dart 執行時)來執行 AOT 模組

dart compile aot-snapshot bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.aot
dartaotruntime bin/myapp.aot

要指定輸出檔案的路徑,請使用 -o--output 選項

dart compile exe bin/myapp.dart -o bin/runme

有關更多選項和用法資訊,請執行 dart compile [<subcommand>] --help

dart compile exe --help

dart compile 命令取代了 dart2nativedart2aotdart2js 命令。

請參閱 native_app 示例,瞭解使用 dart compile 編譯原生應用以及執行該應用的簡單示例。

子命令

#

下表顯示了 dart compile 的子命令。

子命令輸出更多資訊
exe獨立可執行檔案一個獨立的、特定於架構的可執行檔案,包含編譯為機器程式碼的原始碼和一個處理型別檢查和垃圾回收的小型 Dart 執行時
瞭解更多。
aot-snapshotAOT 模組一個特定於架構的檔案,包含編譯為機器程式碼的原始碼,但不包含 Dart 執行時
瞭解更多。
jit-snapshotJIT 模組一個特定於架構的檔案,包含所有原始碼的中間表示,以及程式訓練執行期間執行的原始碼的最佳化表示。如果訓練資料良好,JIT 編譯的程式碼可以比 AOT 程式碼具有更快的峰值效能。
瞭解更多。
kernelKernel 模組原始碼的可移植中間表示
瞭解更多。
jsJavaScript一個可部署的 JavaScript 檔案,由原始碼編譯而成。
瞭解更多。
wasmWebAssembly一種可移植的、用於基於棧的虛擬機器的二進位制指令格式。目前正在開發中。
瞭解更多。

輸出型別

#

以下部分詳細介紹了 dart compile 可以生成的每種輸出型別。

獨立可執行檔案 (exe)

#

exe 子命令生成適用於 Windows、macOS 或 Linux 的獨立可執行檔案。獨立可執行檔案是根據指定 Dart 檔案及其依賴項編譯的本地機器程式碼,以及一個處理型別檢查和垃圾回收的小型 Dart 執行時

您可以像處理任何其他可執行檔案一樣分發和執行輸出檔案。

編譯您的應用並設定輸出檔案

dart compile exe bin/myapp.dart -o /tmp/myapp

成功後,此命令將輸出以下內容

Generated: /tmp/myapp

/tmp 目錄執行您的編譯應用

./tmp/myapp

交叉編譯

#

在以下 64 位主機作業系統上支援交叉編譯到 Linux x64 和 ARM64:macOS、Windows 和 Linux。

要使用交叉編譯,請包含以下標誌

--target-os=linux
編譯後的可執行檔案的目標作業系統。目前支援 Linux 作業系統。
--target-arch=value
編譯後的可執行檔案的目標架構。此標誌的值可以是 arm64(64 位 ARM 處理器)或 x64(x86-64 處理器)。

以下命令演示瞭如何為 64 位 Linux 系統交叉編譯獨立可執行檔案

dart compile exe \
  --target-os=linux \
  --target-arch=x64 \
  hello.dart

在內部,此命令會下載額外的 Dart SDK 二進位制檔案並將其快取在 ~/.dart 目錄中。

以下是指定 --verbose 標誌的命令的示例輸出

Downloading https://storage.googleapis.com/dart-archive/channels/dev/signed/hash/...4864.../sdk/gen_snapshot_macos_arm64_linux_x64...
Downloading https://storage.googleapis.com/dart-archive/channels/dev/raw/hash/...64e44.../sdk/dartaotruntime_linux_x64...
Specializing Platform getters for target OS linux.
Generating AOT kernel dill.
Compiling /tmp/hello.dart to /tmp/hello.exe using format Kind.exe:
Generating AOT snapshot. path/to/dir/.dart/3.8.0-265.0.dev/gen_snapshot_macos_arm64_linux_x64 []
Generating executable.
Marking binary executable.
Generated: /tmp/hello.exe

簽名

#

使用 dart compile exe 建立的可執行檔案支援在 macOS 和 Windows 上簽名。

要了解有關平臺特定程式碼簽名的更多資訊,請參閱這些作業系統的平臺文件

已知限制

#

exe 子命令有以下已知限制

  • 不支援 dart:mirrorsdart:developer。有關您可以使用的核心庫的完整列表,請參考多平臺原生平臺庫表。

  • 支援交叉編譯,但目標作業系統僅限於 Linux。要了解更多資訊,請查閱交叉編譯

AOT 模組 (aot-snapshot)

#

分發多個命令列應用時,使用 AOT 模組可減少磁碟空間需求。aot-snapshot 子命令生成一個特定於編譯應用當前架構的輸出檔案。

例如,如果您使用 macOS 建立 .aot 檔案,則該檔案只能在 macOS 上執行。Dart 在 Windows、macOS 和 Linux 上支援 AOT 模組。

編譯您的應用並設定輸出檔案

dart compile aot-snapshot bin/myapp.dart

成功後,此命令將輸出以下內容

Generated: /Users/me/myapp/bin/myapp.aot

/bin 目錄執行您編譯的應用

dartaotruntime bin/myapp.aot

要了解更多資訊,請參閱 dartaotruntime 文件

交叉編譯

#

aot-snapshot 子命令的交叉編譯支援與 exe 子命令的可用支援相同。有關更多資訊,請參閱獨立可執行檔案 (exe)

已知限制

#

aot-snapshot 子命令的限制與 exe 子命令相同。有關更多資訊,請參閱獨立可執行檔案 (exe)

JIT 模組 (jit-snapshot)

#

JIT 模組包含程式訓練執行期間生成的所有已解析類和已編譯程式碼。

dart compile jit-snapshot bin/myapp.dart
Compiling bin/myapp.dart to jit-snapshot file bin/myapp.jit.
Hello world!
dart run bin/myapp.jit
Hello world!

當從應用模組執行時,Dart VM 不需要解析或編譯在訓練執行期間已經使用的類和函式,因此 VM 更快地開始執行使用者程式碼。

這些模組是特定於架構的,與使用 kernel 子命令生成的模組不同。

可移植模組 (kernel)

#

使用 kernel 子命令將應用打包成一個單一、可移植的檔案,可以在所有作業系統和 CPU 架構上執行。核心模組包含 Dart 程式的抽象語法樹 (Kernel AST) 的二進位制形式。

這是一個建立和執行核心模組的示例

dart compile kernel bin/myapp.dart
Compiling bin/myapp.dart to kernel file bin/myapp.dill.
dart run bin/myapp.dill

雖然核心模組的啟動時間比 Dart 程式碼縮短了,但它們的啟動時間可能位元定於架構的 AOT 輸出格式慢得多。

JavaScript (js)

#

js 子命令將 Dart 程式碼編譯為可部署的 JavaScript。

選項

#

dart compile js 命令有多個選項可以自定義 JavaScript 程式碼編譯。

基本選項
#

常用選項包括

-o <file>--output=<file>

將輸出生成到 <file>。如果未指定,輸出將寫入名為 out.js 的檔案。

--enable-asserts

啟用斷言檢查。

-O{0|1|2|3|4}

控制最佳化以減小檔案大小並提高程式碼效能。要了解有關這些最佳化的更多資訊,請執行 dart compile js -hv

  • -O0: 停用許多最佳化。

  • -O1: 啟用預設最佳化。

  • -O2: 啟用 -O1 最佳化,以及尊重語言語義且對所有程式都安全的額外最佳化(如程式碼壓縮)。

  • -O3: 啟用 -O2 最佳化,並省略隱式型別檢查。

  • -O4: 啟用比 -O3 更激進的最佳化,但具有相同的假設。

--no-source-maps

不生成源對映檔案。

-h--help

顯示幫助。要獲取所有選項的資訊,請使用 -hv

路徑和環境選項
#

其他一些方便的選項包括

--packages=<path>
指定包解析配置檔案的路徑。有關更多資訊,請查閱 Dart 包配置檔案規範。
-D<flag>=<value>
定義一個環境變數及其值對,可以透過 String.fromEnvironmentint.fromEnvironmentbool.fromEnvironmentbool.hasEnvironment 訪問。要了解有關環境宣告的更多資訊,請參閱使用編譯環境宣告配置應用
--version
顯示 dart 的版本資訊。
顯示選項
#

以下選項可幫助您控制編譯器輸出。

--suppress-warnings
不顯示警告。
--suppress-hints
不顯示提示。
--terse
發出診斷資訊,但不建議如何解決診斷出的問題。
-v--verbose
顯示大量資訊。
分析選項
#

以下選項控制對 Dart 程式碼執行的分析。

--fatal-warnings
將警告視為編譯錯誤。
--enable-diagnostic-colors
為診斷訊息新增顏色。
--show-package-warnings
顯示從包生成的警告和提示。
--csp
在生成的輸出中停用程式碼的動態生成。這對於滿足 CSP 限制是必需的(請參閱 W3C 內容安全策略)。
--dump-info
生成一個檔案(字尾為 .info.json),其中包含有關生成程式碼的資訊。您可以使用 dart2js_info 中的工具檢查生成的檔案。

編譯 Web 應用示例

#

例如,要將 Dart 應用程式編譯為最佳化的 JavaScript,請執行以下命令

dart compile js -O2 -o out/main.js web/main.dart

改進生產 Web 編譯

#

遵循以下實踐可以改進型別推斷、減小檔案大小並提高 JavaScript 效能

  • 不要使用 Function.apply()
  • 不要覆蓋 noSuchMethod()
  • 避免將變數設定為 null
  • 對傳遞給每個函式或方法的引數型別保持一致。

要了解有關構建和部署 JavaScript 應用程式的更多資訊,請查閱Web 部署