Flutter编译时如何排除指定文件?多应用资源差异化配置
编译时排除指定资源文件夹的方案
Android项目(Gradle)
如果是Android项目,直接在模块的build.gradle(Groovy)或build.gradle.kts(Kotlin DSL)中配置资源过滤,就能让编译过程自动忽略指定文件夹:
- Groovy语法示例:
android { sourceSets { main { assets { exclude 'images_project2/**' // 也可以直接指定只包含目标文件夹:include 'images_project1/**' } } } }
- Kotlin DSL示例:
android { sourceSets { main { assets { exclude("images_project2/**") // include("images_project1/**") } } } }
配置后,Gradle打包时会自动跳过images_project2下的所有资源,不会将其加入APK。
Web前端项目
1. Webpack
根据资源加载方式,有两种配置方式:
- 针对资源加载规则过滤:
module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif|svg)$/i, exclude: /images_project2/, type: 'asset/resource', }, ], }, };
- 用
copy-webpack-plugin复制静态资源时过滤:
const CopyPlugin = require('copy-webpack-plugin'); module.exports = { plugins: [ new CopyPlugin({ patterns: [ { from: 'assets', to: 'assets', globOptions: { ignore: ['**/images_project2/**'], }, }, ], }), ], };
2. Vite
可以通过rollupOptions自定义资源过滤,或者用环境变量配合条件编译:
import { defineConfig } from 'vite'; export default defineConfig({ build: { rollupOptions: { plugins: [ { name: 'exclude-assets', generateBundle(_, bundle) { // 删除打包产物中包含images_project2的资源 Object.keys(bundle).forEach(key => { if (key.includes('images_project2')) { delete bundle[key]; } }); }, }, ], }, }, // 也可以直接指定只包含目标资源目录 assetsInclude: [/images_project1\/.*/], });
更高效的多变体构建方案
如果需要频繁切换不同应用的资源,推荐配置多构建变体,彻底告别手动操作:
- Android项目用Product Flavors:
android { productFlavors { project1 { sourceSets.project1.assets.srcDirs = ['assets/images_project1'] } project2 { sourceSets.project2.assets.srcDirs = ['assets/images_project2'] } } }
编译时直接执行对应变体的打包命令即可,比如./gradlew assembleProject1Release,只会打包project1的资源。
- 前端项目用环境变量+脚本:
在package.json中添加不同构建脚本:
{ "scripts": { "build:project1": "VITE_APP_PROJECT=project1 vite build", "build:project2": "VITE_APP_PROJECT=project2 vite build" } }
然后在代码或配置中根据环境变量判断加载对应资源,配合Vite/Webpack的tree-shaking,编译时会自动剔除未使用的资源文件夹内容。
内容的提问来源于stack exchange,提问作者Bohdan Ilkiv
相关产品推荐
相关产品推荐

