flutter将pubspec.lock的所有依赖项移动到pubspec.yaml以报告错误



为了控制所有间接依赖项的版本,我将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获取失败(1;因为xxx依赖于sky_engine>=0.0.2哪个需要SDK版本<2.0.0,版本解决失败。(

错误很明显,sky_engine需要SDK版本<2.0.0。但sky_engine是flutter sdk的依赖项,在我转到pubspec.yaml之前,一切都正常。

我的问题:

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

为什么sky_engine在pubspec.lock中工作而没有版本问题?

我不确定,但我猜测Flutter中的引用是从Flutter SDK中提取的,但您将其添加到pubspec的方式是试图从pub中提取这个非常旧的包。

如果我不降低flutter sdk版本,我该如何解决当前的问题?

您可以从列表中删除sky_engine。它将通过您的Flutter SDK进行简单版本化。但是:

如果我想控制所有间接依赖版本,有更好的方法吗?

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

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

对于应用程序包,我们建议您提交pubspec.lock文件。保存pubspec.lock可确保在应用程序上工作的每个人都使用完全相同的版本。

但是,如果您正在创建包/可重用库,这样做可能会为使用该包的项目创建不必要的版本约束,因此这可能不是一个好主意。你没有说为什么你试图这样做。

我重新检查了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_test中的sources都是sdk,然后我参考了flutter和flutter_testpubspec.yaml中的使用,所以我得到了以下的写作,它是有效的。

sky_engine:
sdk: flutter

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

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

最新更新