为何flutter pub get会提示更新未直接引入的内部依赖?
问题
为何执行flutter pub get命令时,会显示并提示更新一些未在pubspec.yaml文件中直接使用的内部依赖?
flutter pub get执行结果:
Resolving dependencies... (1.2s) _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) coverage 1.6.4 (1.7.2 available) dart_style 2.3.2 (2.3.4 available) ffi 2.1.0 (2.1.2 available) flutter_web_auth_2 2.2.1 (3.1.1 available) flutter_web_auth_2_platform_interface 2.1.4 (3.1.0 available) hotreloader 3.0.6 (4.1.0 available) http 1.0.0 (1.2.0 available) image 4.1.3 (4.1.4 available) js 0.6.7 (0.7.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) package_info_plus 4.2.0 (5.0.1 available) path 1.8.3 (1.9.0 available) pointycastle 3.7.3 (3.7.4 available) smart_auth 1.1.1 (2.0.0 available) test 1.24.9 (1.25.1 available) test_api 0.6.1 (0.7.0 available) test_core 0.5.9 (0.6.0 available) time 2.1.3 (2.1.4 available) uuid 3.0.7 (4.3.3 available) vm_service 11.10.0 (14.0.0 available) web 0.3.0 (0.4.2 available) web_socket_channel 2.4.0 (2.4.3 available) Got dependencies! 26 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
我的pubspec.yaml文件内容:
environment: sdk: '>=3.0.0 <4.0.0' dependencies: flutter: sdk: flutter flutter_native_splash: ^2.3.9 fpdart: ^1.1.0 flutter_hooks: ^0.20.4 hooks_riverpod: ^2.4.9 riverpod_annotation: ^2.3.3 freezed_annotation: ^2.4.1 intl: ^0.19.0 json_annotation: ^4.8.1 modddels_annotation_fpdart: ^0.2.0 ulid: ^2.0.0 flex_color_scheme: ^7.3.1 google_fonts: ^6.1.0 theme_extensions_builder_annotation: ^3.0.0 responsive_framework: ^1.1.1 go_router: ^13.0.1 shared_preferences: ^2.2.2 pinput: ^3.0.1 firebase_core: ^2.24.2 firebase_auth: ^4.16.0 isar: ^4.0.0-dev.14 isar_flutter_libs: ^4.0.0-dev.14 path_provider: ^2.1.2 appwrite: ^11.0.1 dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.4.8 freezed: ^2.4.6 json_serializable: ^6.7.1 custom_lint: ^0.5.8 flutter_lints: ^3.0.1 riverpod_generator: ^2.3.9 riverpod_lint: ^2.3.7 flutter_gen_runner: ^5.4.0 modddels: ^0.2.0 theme_extensions_builder: ^3.0.1 go_router_builder: ^2.4.1
我认为只需关注pubspec.yaml中直接引入的依赖,为何会显示上述这类内部依赖?
回答
这些你看到的“内部依赖”其实是间接依赖——也就是你在pubspec.yaml里直接声明的那些依赖,它们自身还依赖了其他包,这些被嵌套引用的包就是间接依赖。
当执行flutter pub get时,Pub包管理器会自动解析整个依赖树:从你直接声明的包出发,递归拉取它们所有需要的子依赖,确保项目能正常构建运行。所以这些间接依赖也会被下载到项目中,自然也会被检测到版本更新。
举个例子:你用的firebase_auth、shared_preferences这类包,内部会依赖http、uuid、package_info_plus这些工具包;而riverpod_generator、build_runner这类开发依赖,又会依赖analyzer、dart_style这类代码分析或格式化工具——这些都是你看到的“未直接使用”的包。
至于提示“新版本不兼容依赖约束”,是因为直接依赖的包在自身的pubspec里对间接依赖的版本做了限制(比如要求http: ^1.0.0,就只能用1.x系列,不能直接升到2.x),所以Pub会告诉你有新版本,但当前约束下没法更新。
如果想理清这些依赖关系,可以执行flutter pub deps命令,它会打印整个依赖树的层级结构,你能清楚看到每个间接依赖是被哪个直接依赖引入的。
内容的提问来源于Stack Exchange,提问作者Jack Wilson
相关产品推荐
相关产品推荐

