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 --helpdart compile 命令替代了 dart2native 、 dart2aot 和 dart2js 命令。
有关使用 dart compile 编译原生应用以及运行应用的示例,请参阅 native_app 示例。
子命令
#下表显示了 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签名
#使用 dart compile exe 创建的可执行文件支持在 macOS 和 Windows 上签名。
要了解有关特定于平台的代码签名的更多信息,请参阅这些操作系统的平台文档:
- Windows
SignTool.exe文档 - Apple 代码签名指南
已知限制
#exe 子命令有一些已知的限制:
- 不支持交叉编译(issue 28617)
- 编译器只能为编译操作系统创建机器代码。 要创建 macOS、Windows 和 Linux 的可执行文件,您需要运行编译器三次。 您也可以使用支持这三种操作系统的持续集成 (CI) 提供商。
- 不支持
dart:mirrors和dart: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.aotaot-snapshot 子命令有一些已知的限制。
- 不支持交叉编译(issue 28617)
- 编译器只能为编译操作系统创建机器代码。 要创建 macOS、Windows 和 Linux 的可执行文件,您需要运行编译器三次。 您也可以使用支持这三种操作系统的持续集成 (CI) 提供商。
- 不支持
dart:mirrors和dart: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.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 部署 。
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面最后更新于 2025-02-05。 查看源代码 或 报告问题.