Dart 2.8版本发布:提升打包速度,保障依赖关系永不过时

发表时间: 2020-05-07 09:08

2020年5月6日,Dart产品经理迈克尔·汤姆森宣布发布Dart2.8版本,并且Dart 2.8还带来了Dart语言和库中的一些小突破。这些更改为我们的第一个版本的

null安全功能奠定了基础。

突破性变革为零安全铺平道路

应用程序崩溃的常见原因是尝试使用恰好是的变量的代码null。在1965年推出空引用名言称他们为他的“数十亿美元的错误”在2009年的QCon谈话。在某些情况下,空值很有用;面临的挑战是将那些情况与不存在的情况区分开。在过去的一年中,汤姆森表示他们一直在忙于为Dart中的声音无效安全性提供支持。这种支持将扩展类型系统以表示始终不可为空的变量,但除此之外,该类型系统将是完全可靠的:Dart编译器和运行时将能够信任这些类型,并能够在以下情况下生成优化的代码:类型系统保证变量不为空。

可以想象,这是一项庞大的任务,其中包含许多活动部件。为了确保我们可以使用干净的语义构建null安全性,Dart开发团队决定对Dart语言和库进行一些小的突破性更改。这些重大更改对Dart类型系统的一些特殊情况和一些Dart核心库进行了较小的调整,以确保与可空性相关的可用性和性能。我们希望这些重大更改的实际影响(在Dart公告列表中预先宣布)对常规应用程序代码的影响很小。

更高质量的包装生态系统

pub软件包管理器和pub.dev站点为Dart和Flutter提供了一个不断发展的生态系统。pub.dev上提供了将近10,000个软件包,令人惊讶的是,许多有趣的软件包被共享。汤姆森表示帮助包作者创建高质量的包并帮助应用程序开发人员找到这些包是Dart开发团队的核心任务,例如,添加了改进的pub.dev发现了已验证的发布者和Flutter收藏夹。

今天,Dart开发团队宣布从pub.dev信息库检索软件包时的性能要快得多,并且它提供了一个新工具来帮助我们保持所有软件包依赖关系的更新。随着现代应用程序的复杂性,我们的应用程序可能依赖于数十个软件包。但是,如何确保将它们全部更新为最新版本,以确保获得最新的依赖关系以及所有可用的错误修复和性能改进?从Dart 2.8开始,我们可以使用pub outdated,这是一种新工具,用于自动确定需要将哪些依赖项更新为最新和最新版本。

Dart 2.8 Pub工具的性能改进

通过添加对运行时并行获取软件包的支持pub get以及推迟pub run预编译,Dart开发团队优化了pub工具的性能。

在运行flutter pub get用创建的新项目的非正式基准中flutter create,总执行时间从Flutter 1.12(使用Dart 2.7)中的大约6.5秒减少到Flutter 1.17(Dart 2.8)中的2.5秒。在更大的应用程序(例如Flutter gallery)中,时间从大约15秒减少到大约3秒!

管理其依赖的 Pub outdated

Dart代码中的依赖项被捕获在pubspec文件中。当我们通过运行命令从pub.dev中检索软件包时pub get,pub版本解释器(使用PubGrub算法)将运行一个过程,以确定满足我们从pubspec中列出的约束的所有依赖项的最新可能版本集。请注意,pub使用单版本方案,其中每个软件包都包含在应用程序中的仅单版本中;这是一项重要的优化措施,可确保我们的应用大小尽可能的小。


让我们考虑一个具体的例子。假设你正在构建一个应用程序,它pubspec.yaml包含以下内容:

dependencies:
foo: ^1.3.0
bar: ^2.0.0

你运行pub get,该工具将创建一个pubspec.lock具有以下版本的文件:

packages:
foo:
version: "1.3.0"
bar:
version: "2.0.1"

几个月过去了,pub.dev现在具有foo(1.3.1)和bar(2.1.0和3.0.3)的新版本。那么我们应该如何发现这些新版本可用?对于次要的版本升级(foo1.4.0和bar2.1.0),我们仍然可以运行pub upgrade,但是却不会不会给你推送bar3.0.0。要发现新版本,我们必须访问pub.dev上的每个软件包并查看其最新版本。另外,我们可以使用社区解决方案,例如Paulina Szklarska的版本检查器或Jeroen Meijer的pubspec助手。

使用pub outdated,Dart SDK现在支持版本发现。如果我们使用的是具有Dart或Flutter支持的IDE,请使用打开文件时显示的Pub过时操作pubspec.yaml。或者,我们可以从终端运行pub outdated(或flutter pub outdated):


$ pub outdatedDependencies Current Upgradable Resolvable Latest
foo 1.3.0 1.3.1 1.3.1 1.3.1
bar 2.0.1 2.1.0 3.0.3 3.0.3

1 upgradable dependency is locked (in pubspec.lock) to an older version.

To update it, use `pub upgrade`.

1 dependency is constrained to a version that is older than a resolvable version.


此输出告诉我们,我们可以进行自动升级到foo1.3.1 pub upgrade,这将使我们使用到foo的最新版本。但这还告诉我们,虽然我们可以自动升级到bar2.1.0,但仍可以使用版本3.0.3。由于升级到bar3.0.3是主要版本升级,因此我们需要通过编辑pubspec.yaml文件来选择升级:

dependencies:
foo: ^1.3.0
bar: ^3.0.3

完成编辑并运行后pub upgrade,pub outdated现在报告的所有依赖项都是最新的:

$ pub outdated

Dependencies Current Upgradable Resolvable Latest

all up-to-date