我的 /assets/files 文件夹中有 8000 多个名为(1.txt、2.txt、3.txt 等)的文件。但是我的调试构建不需要所有这些。我只需要前 30 个。事实上,如果我将所有这些文件留在资产文件夹中,构建时间会很长。
我了解到有一个 source set 概念,但它仅适用于 Android Studio 上的 Java 和 Kotlin。
如何从 Flutter 上的调试构建中排除那些超出的文件?
这个“问题”还没有任何内置的解决方案(因为 Dart 和 Flutter 的设计)
讨论了以下问题:
https://github.com/flutter/flutter/issues/79261
有点 hacky(但可行)的解决方案是编写
pubspec.yaml
版本的脚本,以在每次构建之前更新要导入的资产。以下方法可行:
第 1 步 - 更新您的
pubspec.yaml
以“标记”您想要更新的 assets
部分。
flutter:
assets:
- assets/icons/icon.png
- assets/translations/
#DYN_ASSETS_START
- assets/images/
#DYN_ASSETS_END
这里的标签显然是
#DYN_ASSETS_START
和#DYN_ASSETS_END
第 2 步 - 创建脚本来更新您的资产。
以下只是一个工作示例,它可以得到很大的改进,因为我距离成为 Bash 专家还很远。
该脚本的重点是找到在
pubspec.yaml
中设置的两个标签并更新这两个标签之间的所有内容。
#!/bin/bash
BUILD_MODE=$1
nl='
'
if [ "$BUILD_MODE" = "DEBUG" ]; then
sed '/#DYN_ASSETS_START/,/#DYN_ASSETS_END/c\
#DYN_ASSETS_START'"\\${nl}"' - assets/images/image1.png'"\\${nl}"' - assets/images/image2.png'"\\${nl}"' - assets/images/image3.png'"\\${nl}"' - assets/images/image4.png'"\\${nl}"' - assets/images/image5.png'"\\${nl}"' #DYN_ASSETS_END'"\\${nl}" pubspec.yaml > temp.yaml
mv temp.yaml pubspec.yaml
elif [ "$BUILD_MODE" = "RELEASE" ]; then
sed '/#DYN_ASSETS_START/,/#DYN_ASSETS_END/c\
#DYN_ASSETS_START'"\\${nl}"' - assets/images/'"\\${nl}"' #DYN_ASSETS_END'"\\${nl}" pubspec.yaml > temp.yaml
mv temp.yaml pubspec.yaml
fi
免责声明:这个脚本一点也不性感。
sed
可能不是实现这一点的最佳工具,代码很难维护阅读和发展,而且我只在MacOS上测试了它(我怀疑它是否可以在其他环境下工作)。第 4 步 - 创建 Makefile。
build-android-debug:
./your_script.sh DEBUG
flutter pub get
flutter build apk
build-android-release:
./your_script.sh RELEASE
flutter pub get
flutter build apk --release
第 5 步 - 触发 Makefile 流程
make build-android-debug
您现在可以使用 pubspec.yaml
文件中的
资源 + 口味可能性。
例如:
flutter:
assets:
- assets/my_production_assets/ <-- assets available for all builds
- path: assets/my_secret_file.yaml <-- assets only available for internal builds
flavors:
- internal
在这里,只有
assets/my_production_assets/
文件会包含在我的发布版本中。 my_secret_file.yaml
只会包含在我的内部(调试)构建中。
如果需要,您可以使用
.vscode/launch.json
文件定义风味,或者在构建应用程序时简单地使用 --flavor [your_environment]
命令(在我的示例中为 internal
)。