如何从Flutter中删除或识别未使用的软件包以减小项目的大小?

38
我在我的Flutter项目中使用了一些包,现在不再需要它们,即wilddog_authwilddog_sync。我可以从pubspec.yaml文件以及我的Dart文件中移除引用(例如删除import 'package:wilddog_sync/wilddog_sync.dart'等),也可以从MainActivity.java以及Xcode项目中移除引用,但无法清除Flutter、cocoapod和gradle安装的未使用文件。 现在,是否有一个统一的命令可以一次性删除所有未使用的包?
我非常确定只使用flutter clean只会删除 build 文件夹,而在从pubspec.yaml文件中移除包后使用flutter packages get并不会删除或中的包。
例如,在执行完flutter cleanflutter packages get之后,我重新构建了该项目:
Launching lib/main.dart on Android SDK built for x86 64 in debug mode...
Initializing gradle...
Resolving dependencies...
Running 'gradlew assembleDebug'...
Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk...
I/FlutterActivityDelegate(11331): onResume setting current activity to this
I/Choreographer(11331): Skipped 107 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation(11331): eglMakeCurrent: 0x79f21b4dbec0: ver 2 0 (tinfo 0x79f219b4f160)
I/OpenGLRenderer(11331): Davey! duration=1903ms; Flags=1, IntendedVsync=7544454683637, Vsync=7546238016899, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=7546253803603, AnimationStart=7546253996603, PerformTraversalsStart=7546254171603, DrawStart=7546279222603, SyncQueued=7546288526603, SyncStart=7546295569603, IssueDrawCommandsStart=7546296644603, SwapBuffers=7546334455603, FrameCompleted=7546365204603, DequeueBufferDuration=2892000, QueueBufferDuration=199000, 
Syncing files to device Android SDK built for x86 64...
D/        (11331): HostConnection::get() New Host Connection established 0x79f219ab81e0, tid 11383
D/EGL_emulation(11331): eglMakeCurrent: 0x79f21b5e26e0: ver 2 0 (tinfo 0x79f219aa66c0)
W/IInputConnectionWrapper(11331): getCursorCapsMode on inactive InputConnection

cocoapods gradle

但所有的包文件都保留下来了。

当然,我可以进入./ios/并运行pods install来删除cocoapods:

pod install
Analyzing dependencies
Fetching podspec for `Flutter` from `.symlinks/flutter/ios`
Removing Wilddog
Removing WilddogCore
Removing WilddogSync
Downloading dependencies
Using Flutter (1.0.0)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

[!] Automatically assigning platform `ios` with version `8.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

5
我不知道Java/Swift/ObjectC的依赖关系,但对于Dart的依赖关系,只需从pubspec.yaml中删除它们并运行flutter packages get即可。 - Günter Zöchbauer
5
Flutter拥有树摇优化编译器,因此未使用的包不应包含在捆绑文件中。在构建之前尝试运行flutter clean命令。 - Yamin
1
从pubspec.yaml中删除插件就可以了。然后运行 flutter packages get。当您重新构建项目时,Flutter会自动删除本地插件代码。 - boformer
你是指使用 flutter build 命令吗?我重新构建成功了,但gradle和cocoapods中的所有文件都保留不变。 - Aero Wang
是的,从pubspec.yaml中删除条目是我做的第一件事。在./ios/中运行pod install以删除Xcode项目中未使用的软件包显然是有效的(但您必须先修改Xcode项目)。我的目标是减少我需要执行的清理软件包的步骤。 - Aero Wang
显示剩余14条评论
10个回答

29

有一种直观的方法。

安装这个包。

dev_dependencies:
  dependency_validator: ^x.x.x

然后运行 flutter pub run dependency_validator 命令。它会显示有关已安装包的所有详细信息。例如:=>

这些包在 pubspec.yaml 中被固定:

  • dependency_validator: null -- 这是一个直接固定的版本。
  • permission_handler: null -- 这是一个直接固定的版本。
  • swipe_to: null -- 这是一个直接固定的版本。

这些包在 lib/ 中被使用,但不是依赖项:

  • connectivity
  • meta
  • path

以下包含可执行文件,假设它们被使用:

  • flutter_native_splash

这些包可能未被使用,或者你可能正在使用这些包中的资源:

  • cupertino_icons
  • firebase_analytics
  • http
  • loading
  • sign_in_with_apple

3
有时候在项目中可能会安装一些未使用的包,但是在开发阶段曾经安装过。为了找出这些包,请先进入每个dart文件并删除未使用的导入,然后进入pubspec.yaml并逐个注释掉包并保存项目。然后刷新应用程序(不是热重载)。如果该包在项目中被使用,则会抛出错误。重复所有包的步骤后,您将能够从pubspec中删除所有不需要的包。
现在,删除pubspec.lock文件,并再次运行pub get。您的项目现在只有所需的包,这可能是最小的可实现大小。

enter image description here


3

在Flutter SDK目录中删除.pub-cache托管文件夹

cd path/to/flutter_sdk_directory

rm -rf .pub-cache/hosted

在项目根目录中删除.packages文件。

 cd path/to/project_root_directory

 rm -rf .packages

获取项目的软件包。
cd path/to/project_root_directory

flutter pub get

在Android Studio中打开项目。

完成。


2

有一种显而易见的方法很容易被忽视或认为不可行。

如果使用IntelliJ,只需执行“在文件中查找”(PC上SHIFT+CTRL+F,Mac上SHIFT+CMD+F),选择“目录”,然后选择您的项目的lib文件夹。

然后逐个搜索您的插件列表,并依次搜索每个插件的名称。如果插件未被使用,则不会出现以下情况:

  • 没有与其名称匹配的搜索结果
  • 仅在“generated_plugin_registrant.dart”中使用
  • 唯一的命中结果是灰色的导入语句(被IntelliJ标记为未使用)

使用这种方法,我不到一分钟就消除了8个未使用的插件。


1
你可以使用以下三个步骤来解决这个问题:
  1. 运行 'flutter clean'
  2. 在 pubspec.yaml 中删除不需要的依赖项
  3. 删除 pubspec.lock 文件
重新加载项目,再次执行 'pub get' 命令并运行 iOS/Android 项目。

0

最好的方法是

flutter clean

如果这个方法不起作用,只需创建一个新项目,将旧的代码复制到新项目中,在运行 pub get 之前,您可以仅添加所需的依赖项。


0

您可以在终端中输入以下命令来删除包:dart pub remove <packagename>

例如:要删除flutter_svg:^0.22.0,请输入dart pub remove flutter_svg

如需更多信息,请查看https://dart.dev/tools/pub/cmd/pub-remove


0

0

0
Flutter通过运行以下命令来处理这个问题:
$ flutter pub cache repair

我最初尝试从pubspec.yaml中删除webview_flutter: 4.1.0并运行。

$ flutter clean
$ flutter pub get

但是Flutter在.pub-cache/hosted目录中保留了流行包的缓存版本,因此您必须手动删除缓存的包或最好通过运行第一个命令来删除。

我正在使用Flutter:3.7.10和Dart:2.19.6


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接