目次

dart compile

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コマンドは、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

署名

#

dart compile exeで作成された実行ファイルは、macOSとWindowsで署名をサポートしています。

プラットフォーム固有のコード署名について詳しくは、各オペレーティングシステムのプラットフォームドキュメントを参照してください。

既知の制限事項

#

exeサブコマンドには、いくつかの既知の制限事項があります。

クロスコンパイルのサポートなし(issue 28617)
コンパイラは、コンパイルしているオペレーティングシステムに対してのみ機械コードを作成できます。macOS、Windows、Linux用の実行ファイルを作成するには、コンパイラを3回実行する必要があります。3つのオペレーティングシステムすべてをサポートする継続的インテグレーション(CI)プロバイダーを使用することもできます。
dart:mirrorsdart:developerはサポートされていません。
使用できるコアライブラリの完全なリストについては、マルチプラットフォームネイティブプラットフォームのライブラリ表を参照してください。

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
$ dartaotruntime bin/myapp.aot

aot-snapshotサブコマンドには、いくつかの既知の制限事項があります。

クロスコンパイルのサポートなし(issue 28617)
コンパイラは、コンパイルしているオペレーティングシステムに対してのみ機械コードを作成できます。macOS、Windows、Linux用の実行ファイルを作成するには、コンパイラを3回実行する必要があります。3つのオペレーティングシステムすべてをサポートする継続的インテグレーション(CI)プロバイダーを使用することもできます。
dart:mirrorsdart:developerはサポートされていません。
使用できるコアライブラリの完全なリストについては、マルチプラットフォームネイティブプラットフォームのライブラリ表を参照してください。

詳細については、dartaotruntimeのドキュメントを参照してください。

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アーキテクチャで実行できる単一のポータブルファイルにアプリをパッケージ化します。Kernelモジュールには、Dartプログラムの抽象構文木(Kernel AST)のバイナリ形式が含まれています。

Kernelモジュールの作成と実行の例を以下に示します。

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

Kernelモジュールは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のツールを使用して、生成されたファイルを検査できます。

ウェブアプリのコンパイル例

#

たとえば、Dartアプリケーションを最適化されたJavaScriptにコンパイルするには、次のコマンドを実行します。

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

本番環境向けウェブコンパイルの改善

#

型推論の改善、ファイルサイズの削減、JavaScriptのパフォーマンス向上のためには、次の手順に従ってください。

  • Function.apply()を使用しないでください。
  • noSuchMethod()をオーバーライドしないでください。
  • 変数をnullに設定することは避けてください。
  • 各関数またはメソッドに渡す引数の型を統一してください。

JavaScriptアプリケーションのビルドとデプロイの詳細については、ウェブデプロイを参照してください。