性能优化
当 dart pub get 因包版本不兼容失败时,用…
适用于 Dart 项目遇到包版本冲突、撤回版本或需要审计/升级依赖时,安全调整 pubspec.yaml 与 pubspec.lock。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当 dart pub get 因包版本不通用
解决思路
- 理解 Dart 的严格单版本规则:项目及其所有传递依赖必须解析到同一个共享版本;这能避免运行时类型不匹配,但会带来版本锁定。
- 为减少版本锁定,在 pubspec.yaml 中优先使用版本约束而不是固定版本;pubspec.lock 保存精确解析版本,用于可复现构建。
- 理解 dart pub outdated 的输出列:Current 是 pubspec.lock 当前记录的版本;Upgradable 是 pubspec.yaml 约束允许的最新版本,dart pub upgrade 会解析到该版本;Resolvable 是结合项目所有其他依赖后可解析到的绝对最新版本;Latest 是包已发布的最新版本(不含预发布版)。
- 在 pubspec.yaml 的 dependencies 中始终使用 caret 语法,例如 ^1.2.3,让 pub 在解析时选择更新的非破坏性版本,直到(但不包括)下一个主版本。
- 将 dev_dependencies 的下界收紧到当前实际使用的精确版本,以降低解析复杂度,并防止选择到更旧且不兼容的开发工具。
- 在 CI/CD 流水线中使用 dart pub get --enforce-lockfile,确保生产环境使用本地测试过的精确版本。
- 审计依赖时运行 dart pub outdated。
- 查看 Upgradable 列,找出无需修改 pubspec.yaml 就可以更新的包。
- 查看 Resolvable 列,找出需要修改 pubspec.yaml 中约束才能更新的包。
- 找出任何被标记为撤回(retracted)或停止维护(discontinued)的包。
- 如果要更新到 Upgradable 版本:运行 dart pub upgrade。
- 如果要更新到 Upgradable 版本:运行 dart pub upgrade --tighten,自动把 pubspec.yaml 中的下界更新为刚解析出的版本。
- 如果要更新到 Resolvable 版本(重大更新):手动编辑 pubspec.yaml,把版本约束提升到与 Resolvable 列匹配,例如把 ^0.11.0 改成 ^0.12.1。
- 如果要更新到 Resolvable 版本(重大更新):运行 dart pub upgrade 解析新约束并更新 pubspec.lock。
- 升级后的反馈循环:运行 dart analyze,查看错误并修复破坏性 API 变更。
- 升级后的反馈循环:运行 dart test,查看失败并修复回归。
- 当 pub 无法找到满足所有约束的具体版本集合,或遇到被撤回的包版本时,采用外科式方式修改锁文件。
- 绝不要删除整个 pubspec.lock 文件后再运行 dart pub get;这会导致整个依赖图发生不受控升级。
- 打开 pubspec.lock。
- 定位冲突或被撤回包对应的具体 YAML 块。
- 只从 pubspec.lock 删除该包的条目。
- 运行 dart pub get,为该特定包获取最新的兼容且未被撤回的版本。
- 冲突解决后的反馈循环:运行 dart pub deps,验证依赖图能正确解析。
- 如果解析失败,找出造成锁定的传递依赖,在 pubspec.yaml 中更新其约束,然后重试。
- 示例:当 dart pub outdated 显示某包可解析到更高的次要/补丁版本时,用 --tighten 自动更新 pubspec.yaml;例如输入 dependencies 中 http: ^0.13.0,运行 dart pub upgrade --tighten http,输出 http: ^0.13.5。
- 示例:如果 package_a 被撤回或锁在冲突中,只从 pubspec.lock 删除 package_a 块;保留 package_b 等其他块不动,然后运行 dart pub get。
适用边界 · 注意事项
- 不适用于非 Dart/Dart pub 项目,或无法运行 dart pub 命令的环境。
- 不要在未定位具体冲突包时删除整个 pubspec.lock;原文明确禁止这种做法。
- 不要在尚未验证本地锁文件或项目需要动态解析依赖时,强行在 CI 中使用 --enforce-lockfile。