メインコンテンツにスキップ

dart compile

このガイドでは、dart compile コマンドを使用して Dart プログラムをターゲットプラットフォームにコンパイルする方法を説明します。

概要

#

dart compile コマンドを使用して、Dart プログラムを ターゲットプラットフォーム にコンパイルします。サブコマンドを使用して指定する出力には、Dart ランタイム を含めることも、モジュールスナップショット とも呼ばれます)にすることもできます。

自己完結型実行可能ファイル(myapp.exe)を生成するために exe サブコマンドを使用した例を次に示します。

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

次の例では、aot-snapshot サブコマンドを使用して、Ahead-of-Time(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 コマンドは、dart2nativedart2aot、および dart2js コマンドに代わるものです。

ネイティブアプリをコンパイルするための dart compile の簡単な例、およびその後のアプリ実行例については、native_app サンプルを参照してください。

サブコマンド

#

次の表は、dart compile のサブコマンドを示しています。

サブコマンド出力詳細情報
exe自己完結型実行可能ファイルソースコードがマシンコードにコンパイルされ、小さなDart ランタイム を含む、スタンドアロンのアーキテクチャ固有の実行可能ファイル。
詳細はこちら。
aot-snapshotAOTモジュールソースコードがマシンコードにコンパイルされているが、Dart ランタイムは含まれていない、アーキテクチャ固有のファイル。
詳細はこちら。
jit-snapshotJITモジュールプログラムのトレーニング実行中に実行されたソースコードの最適化された表現に加えて、すべてのソースコードの中間表現を含むアーキテクチャ固有のファイル。トレーニングデータが良好であれば、JITコンパイルコードはAOTコードよりもピークパフォーマンスが高くなる可能性があります。
詳細はこちら。
kernelカーネルモジュールソースコードのポータブルな 中間表現
詳細はこちら。
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

クロスコンパイル

#

Linux x64 および ARM64 へのクロスコンパイルは、次の 64 ビットホストオペレーティングシステムでサポートされています: 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:mirrors および dart:developer はサポートされていません。使用できるコアライブラリの完全なリストについては、マルチプラットフォーム および ネイティブプラットフォーム のライブラリテーブルを参照してください。

  • クロスコンパイルはサポートされていますが、ターゲット OS は 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.fromEnvironment、または bool.hasEnvironment でアクセスできる環境宣言と値のペアを定義します。環境宣言の詳細については、コンパイル時環境宣言によるアプリの構成 を参照してください。
--version
dart のバージョン情報を表示します。
表示オプション
#

次のオプションは、コンパイラ出力を制御するのに役立ちます。

--suppress-warnings
警告を表示しません。
--suppress-hints
ヒントを表示しません。
--terse
診断メッセージを、問題を解決する方法の提案なしで出力します。
-v または --verbose
多くの情報を表示します。
分析オプション
#

次のオプションは、Dart コードに対する分析を制御します。

--fatal-warnings
警告をコンパイルエラーとして扱います。
--enable-diagnostic-colors
診断メッセージに色を追加します。
--show-package-warnings
パッケージから生成された警告とヒントを表示します。
--csp
生成された出力での動的なコード生成を無効にします。これは CSP 制限(W3C Content Security Policy. を参照)を満たすために必要です。
--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 デプロイメント を参照してください。