跳到主要内容

dart pub outdated

outdatedpub 工具的命令之一。

$ dart pub outdated [options]

使用 dart pub outdated 命令可以识别过时的包依赖项,并获取有关如何更新它们的建议。依赖项管理的最佳实践包括使用最新稳定版本的包,这样你就可以获得最新的 bug 修复和改进。

概览

#

以下是如何使用 dart pub outdated 来帮助你更新你拥有的包的依赖项(无论是应用包还是普通包)

  1. 如果你的包的源码管理中没有 pubspec.lock 文件,请在包的顶级目录(即包含包的 pubspec.yaml 文件的目录)中**运行 dart pub get**。
  2. 运行 dart pub outdated 以识别哪些包依赖项已过时。记下受影响的包,以便后续测试使用它们的代码的行为。
  3. 按照 dart pub outdated 的建议来更新包。有些更新可能只需要运行 dart pub upgrade。其他更新可能需要在运行 dart pub upgrade 之前更新 pubspec.yaml
  4. 运行 dart pub outdated 以确认你正在使用最新的兼容包版本。
  5. 测试你的包,确认其行为仍符合预期。

由于传递性依赖,你的依赖项可能仍然过时。如果你想确定原因,可以尝试运行dart pub deps 命令,并在输出中搜索每个过时包的名称。

示例

#

这里有一个示例,展示了在包含多个过时依赖项的示例包上运行 dart pub outdated 命令。其中三个依赖项(argshttppath)是直接依赖项,一个依赖项(meta)是传递性依赖项。如下例所示,当你在命令行上运行 dart pub outdated 时,它会默认对输出进行着色。

$ dart pub outdated

Package Name  Current    Upgradable  Resolvable  Latest

direct dependencies:
args          1.4.4      1.6.0       1.6.0       1.6.0
http          0.11.3+17  0.11.3+17   0.12.1      0.12.1  
path          1.6.2      1.6.2       1.6.2       1.7.0   

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6      1.1.6       1.1.6       1.1.8   

transitive dev_dependencies: all up-to-date

1 upgradable dependency is locked (in pubspec.lock) to an older version.
To update it, use `dart pub upgrade`.

1 dependency is constrained to a version that is older than a resolvable version.
To update it, edit pubspec.yaml.

可解析版本(Resolvable) 列显示了每个过时依赖项可以升级到的版本。你可以通过查找最左侧非红色值的列来获取更多信息。例如,args 可以升级到 1.6.0 版本,而 http 可以解析到 0.12.1 版本。pathmeta 包虽然不是最新版本,但考虑到所有其他依赖项,它们是最新的可解析版本。

要修复第一个依赖项 (args),它被列为可升级的,你只需要运行 dart pub upgrade 命令即可。

dart pub upgrade
Resolving dependencies...
> args 1.6.0 (was 1.4.4)
  ...
Changed 1 dependency!

要修复第二个依赖项 (http),它被列为可解析的,你可以更改 pubspec 中 http 的条目,使用可解析版本(Resolvable) 列中的版本(或兼容的更高版本)。在脱字号语法中,它是 ^0.12.1。这是 pubspec.yaml 的差异:

-  http: ^0.11.0
+  http: ^0.12.1

编辑完 pubspec.yaml 后,运行 dart pub upgrade 以更新 pubspec.lock 文件。然后可以再次运行 dart pub outdated 以确认已完成所有必需的更改。在此示例中,由于其他依赖项决定的约束,pathmeta 包仍然过时。

dart pub upgrade
...
dart pub outdated
Package Name  Current  Upgradable  Resolvable  Latest

direct dependencies:
path          1.6.2    1.6.2       1.6.2       1.7.0

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6    1.1.6       1.1.6       1.1.8

transitive dev_dependencies: all up-to-date

Dependencies are all on the latest resolvable versions.
Newer versions, while available, are not mutually compatible.

要了解为什么这些包会过时,你可以运行 dart pub deps 命令,并查找对这些包的依赖关系。

dart pub deps -s list
...
dependencies:
...
- terminal_tools 0.1.0
  - path 1.6.2
  - meta 1.1.6
...

如上一个输出所示,该包依赖于 terminal_tools 包,而后者又依赖于旧版本的 pathmeta。一旦 terminal_tools 包得到更新,这个包也应该可以更新了。

输出列

#

dart pub outdated 的输出为每个过时依赖项提供了四列版本信息。以下是示例输出中显示这四个版本列的部分:当前版本 (Current)、可升级版本 (Upgradable)、可解析版本 (Resolvable) 和最新版本 (Latest)。

Package Name  Current    Upgradable  Resolvable  Latest

direct dependencies:
args          1.4.4      1.6.0       1.6.0       1.6.0
http          0.11.3+17  0.11.3+17   0.12.1      0.12.1  
path          1.6.2      1.6.2       1.6.2       1.7.0   

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6      1.1.6       1.1.6       1.1.8
当前版本 (Current)
你的包中使用的版本,记录在 pubspec.lock 文件中。如果包不在 pubspec.lock 中,则该值为 -
可升级版本 (Upgradable)
你的 pubspec.yaml 文件允许的最新版本。这是 dart pub upgrade 解析到的版本。如果“当前版本(Current)”列中的值为 -,则该值为 -
可解析版本 (Resolvable)
与所有其他依赖项结合时可以解析到的最新版本。如果 pubspec.yaml 中的所有版本约束都未设置上限,则此版本与 dart pub upgrade 提供给你的版本相符。值为 - 表示不需要此包。
最新版本 (Latest)
可用的最新包版本,不包括预发布版本,除非你使用 --prereleases 选项。

例如,假设你的应用依赖于 foobar 包,但 bar 的最新版本只允许较旧的主要版本 foo。结果就是,foo 的最新可解析版本与 foo最新版本不同。

编辑 pubspec.yaml 文件时,通常会更新 dependenciesdev_dependencies 部分,以便每个包都使用可解析版本(Resolvable) 列中的版本。

选项

#

有关适用于所有 pub 命令的选项,请参见全局选项

--[no-]dependency-overrides

#

默认情况下,在解析包约束时会考虑dependency_overrides (即使用 --dependency-overrides)。要不考虑覆盖,请使用 --no-dependency-overrides

--[no-]dev-dependencies

#

默认情况下,在解析包约束时会考虑开发依赖项 (即使用 --dev-dependencies)。要不考虑开发依赖项,请使用 --no-dev-dependencies

--json

#

生成 JSON 格式的输出。

--[no-]prereleases

#

默认情况下,在确定最新的包版本时会包括预发布版本 (即使用 --prereleases)。要不考虑预发布版本,请使用 --no-prereleases

--[no-]transitive

#

默认情况下,输出中不包含传递性依赖项 (即使用 --no-transitive)。要包含传递性依赖项,请使用 --transitive

--[no-]up-to-date

#

默认情况下,输出中不包含已经是最新版本的依赖项 (即使用 --no-up-to-date)。要包含已是最新版本的依赖项,请使用 --up-to-date

在工作区中

#

Pub 工作区中,dart pub outdated 会列出所有依赖项