跳到主要内容

dart compile

使用 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 命令。

有关使用 dart compile 编译本地应用的简单示例,以及运行应用的示例,请参阅 native_app 示例。

子命令

#

下表显示了 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 创建可执行文件,您需要运行编译器三次。您还可以使用支持所有三个操作系统的持续集成 (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 创建可执行文件,您需要运行编译器三次。您还可以使用支持所有三个操作系统的持续集成 (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

虽然与 Dart 代码相比,Kernel 模块缩短了启动时间,但与特定于架构的 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 部署