从 Flutter 上的调试构建中排除资产

问题描述 投票:0回答:2

我的 /assets/files 文件夹中有 8000 多个名为(1.txt、2.txt、3.txt 等)的文件。但是我的调试构建不需要所有这些。我只需要前 30 个。事实上,如果我将所有这些文件留在资产文件夹中,构建时间会很长。

我了解到有一个 source set 概念,但它仅适用于 Android Studio 上的 Java 和 Kotlin。

如何从 Flutter 上的调试构建中排除那些超出的文件?

android-studio gradle flutter assets source-sets
2个回答
2
投票

这个“问题”还没有任何内置的解决方案(因为 Dart 和 Flutter 的设计)

讨论了以下问题:
https://github.com/flutter/flutter/issues/79261

有点 hacky(但可行)的解决方案是编写

pubspec.yaml
版本的脚本,以在每次构建之前更新要导入的资产。
由于 Flutter 框架还没有“预构建”方法,因此您可以使用 Makefile 来执行脚本。

以下方法可行:

第 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

0
投票

您现在可以使用 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
)。

© www.soinside.com 2019 - 2024. All rights reserved.