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
命令取代了 dart2native
、dart2aot
和 dart2js
命令。
请参阅 native_app 示例,了解使用 dart compile
编译原生应用以及运行该应用的简单示例。
子命令
#下表显示了 dart compile
的子命令。
子命令 | 输出 | 更多信息 |
---|---|---|
exe | 独立可执行文件 | 一个独立的、特定于架构的可执行文件,包含编译为机器代码的源代码和一个处理类型检查和垃圾回收的小型 Dart 运行时。 了解更多。 |
aot-snapshot | AOT 模块 | 一个特定于架构的文件,包含编译为机器代码的源代码,但不包含 Dart 运行时。 了解更多。 |
jit-snapshot | JIT 模块 | 一个特定于架构的文件,包含所有源代码的中间表示,以及程序训练运行期间执行的源代码的优化表示。如果训练数据良好,JIT 编译的代码可以比 AOT 代码具有更快的峰值性能。 了解更多。 |
kernel | Kernel 模块 | 源代码的可移植中间表示。 了解更多。 |
js | JavaScript | 一个可部署的 JavaScript 文件,由源代码编译而成。 了解更多。 |
wasm | WebAssembly | 一种可移植的、用于基于栈的虚拟机的二进制指令格式。目前正在开发中。 了解更多。 |
输出类型
#以下部分详细介绍了 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 上签名。
要了解有关平台特定代码签名的更多信息,请参阅这些操作系统的平台文档
- Windows
SignTool.exe
文档 - Apple 代码签名指南
已知限制
#exe
子命令有以下已知限制
不支持
dart:mirrors
和dart: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.fromEnvironment
、int.fromEnvironment
、bool.fromEnvironment
或bool.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 部署。