flutter moved all dependencies of pubspec.lock to pubspec.yaml 报错

flutter moved all dependencies of pubspec.lock to pubspec.yaml to report an error

为了控制所有间接依赖的版本,我把pubspec.lock的所有依赖都移到了pubspec.yaml。我比较了pubspec.yamlpubspec.lock的区别,最后pubspec.yaml是这样的:

name: xxxx
description: A new flutter plugin project.
version: 0.0.1
homepage:

environment:
  sdk: ">=2.12.0 <3.0.0"
  flutter: ">=1.20.0"

dependencies:
  flutter:
    sdk: flutter

  # flutter packages=========
  async: 2.6.1
  boolean_selector: 2.1.0
  characters: 1.1.0
  charcode: 1.2.0
  clock: 1.1.0
  collection: 1.15.0
  fake_async: 1.2.0
  ffi: 1.1.2
  matcher: 0.12.10
  meta: 1.3.0
  path: 1.8.0
  sky_engine: 0.0.99
  source_span: 1.8.1
  stack_trace: 1.10.0
  stream_channel: 2.1.0
  string_scanner: 1.1.0
  term_glyph: 1.2.0
  test_api: 0.3.0
  typed_data: 1.3.0
  vector_math: 2.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter

然后报错:

pub get failed (1; Because xxx depends on sky_engine >=0.0.2 which requires SDK version <2.0.0, version solving failed.)

错误很明显,sky_engine需要SDK版本<2.0.0。但是 sky_engine 是 flutter sdk 的依赖项,在我移动到 pubspec.yaml.

之前一切正常

我的问题:

  1. 为什么 sky_enginepubspec.lock 中工作没有版本问题?如果不降低flutter sdk的版本,如何解决目前的问题?
  2. 如果我想控制所有间接依赖的版本,有没有更好的方法?

Why does sky_engine work in pubspec.lock without version problems?

我不确定,但我的猜测是 Flutter 中的引用是从 Flutter SDK 中提取的,但是您将其添加到 pubspec 的方式是试图从 pub 中提取 this very old package

If I don't lower the flutter sdk version, how can I solve the current problem?

您可以从列表中删除 sky_engine。它将通过您的 Flutter SDK 进行隐式版本控制。然而:

If I want to control all indirect dependent versions, is there a better way?

是的,您最好提交 pubspec.lock 文件(并且只在 pubspec.yaml 中列出您的特定依赖项)。这是针对您的应用程序的建议做法:

https://dart.dev/guides/libraries/private-files#pubspeclock

For application packages, we recommend that you commit the pubspec.lock file. Saving pubspec.lock ensures that everyone working on the app uses the exact same versions.

但是,如果您正在创建一个 package/reusable 库,这样做可能会对使用该包的项目产生不必要的版本限制,因此这可能不是一个好主意。你没有说为什么你想这样做。

我重新查看了pubspec.lock文件,发现是SDK依赖方式,我写错了。 这是 pubspec.lock:

# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
  async:
    dependency: "direct main"
    description:
      name: async
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "2.6.1"
  boolean_selector:
    dependency: "direct main"
    description:
      name: boolean_selector
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "2.1.0"
  characters:
    dependency: "direct main"
    description:
      name: characters
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.1.0"
  charcode:
    dependency: "direct main"
    description:
      name: charcode
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.2.0"
  clock:
    dependency: "direct main"
    description:
      name: clock
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.1.0"
  collection:
    dependency: "direct main"
    description:
      name: collection
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.15.0"
  fake_async:
    dependency: "direct main"
    description:
      name: fake_async
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.2.0"
  ffi:
    dependency: "direct main"
    description:
      name: ffi
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.1.2"
  flutter:
    dependency: "direct main"
    description: flutter
    source: sdk
    version: "0.0.0"
  flutter_test:
    dependency: "direct dev"
    description: flutter
    source: sdk
    version: "0.0.0"
  matcher:
    dependency: "direct main"
    description:
      name: matcher
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "0.12.10"
  meta:
    dependency: "direct main"
    description:
      name: meta
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.3.0"
  path:
    dependency: "direct main"
    description:
      name: path
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.8.0"
  sky_engine:
    dependency: "direct main"
    description: flutter
    source: sdk
    version: "0.0.99"
  source_span:
    dependency: "direct main"
    description:
      name: source_span
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.8.1"
  stack_trace:
    dependency: "direct main"
    description:
      name: stack_trace
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.10.0"
  stream_channel:
    dependency: "direct main"
    description:
      name: stream_channel
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "2.1.0"
  string_scanner:
    dependency: "direct main"
    description:
      name: string_scanner
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.1.0"
  term_glyph:
    dependency: "direct main"
    description:
      name: term_glyph
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.2.0"
  test_api:
    dependency: "direct main"
    description:
      name: test_api
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "0.3.0"
  typed_data:
    dependency: "direct main"
    description:
      name: typed_data
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.3.0"
  vector_math:
    dependency: "direct main"
    description:
      name: vector_math
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "2.1.0"
sdks:
  dart: ">=2.12.0 <3.0.0"
  flutter: ">=1.20.0"

发现sky_engineflutterflutter_testsources都是sdk,然后参考flutter的使用和 flutter_testpubspec.yaml 中,所以我得到了以下写作,它有效。

sky_engine:
    sdk: flutter

加上@Danny Tuppeny的建议,我现在有两种控制间接依赖的方法:

  1. 将所有间接依赖项添加到 pubspec.yaml
  2. 应用pubspec.lock提交到远程仓库