Flet 0.86.0 重大变更实战:应用文件只读 Bundle 解包分发与存储目录体系重构迁移指南
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载适用版本Flet 0.86.0搭配serious_python4.0.0。本指南基于当前仓库 website/docs/updates/breaking-changes/v0-86-0/app-files-unpacked-read-only-bundle.md 及仓库源码整理而成后续版本可能新增 API 或迁移路径请以 破坏性变更与弃用索引 为准。Flet 0.86.0 对打包应用的文件如何随包分发与应用数据写到哪做了两项联动改造你的 Python 源码不再以app.zip形式在首次启动时解压而是直接以解包unpacked形态随应用 Bundle 一起分发且应用目录变为只读与此同时三个存储环境变量被重构为职责清晰的层级Python 程序的**当前工作目录cwd**也从应用目录迁移到了可写、应用私有的数据目录。读完本文你将掌握 0.86.0 下写数据与读自带文件的正确姿势、三个FLET_APP_STORAGE_*变量在各平台的真实物理位置以及flet run开发模式如何模拟打包应用行为从而平稳完成迁移。变更总览SummaryFlet 0.86.0配合serious_python4.0.0同时改变了打包应用的 Python 文件分发方式与应用数据的读写位置应用文件以解包形式随 Bundle 分发在 macOS / iOS / Windows / Linux 上应用文件与 Python 标准库、site-packages 一起直接放在应用 Bundle 内不再有首次启动时的app.zip解压过程。在Android上应用以stored不压缩形式的app.zip资源打进 APK安装/更新后首次启动时按版本键version-keyed一次性解压到应用 files 目录。WebPyodide保持不变。应用目录现在是只读的签名后的.app、iOS bundle、Windows 的Program Files、Android 的 APK 都属于系统管理的只读区域。Python 程序的当前工作目录从应用目录迁移到了可写的、应用私有的数据目录该目录通过FLET_APP_STORAGE_DATA暴露给程序。FLET_APP_STORAGE_DATA现在映射到 OS 的 application support应用支持目录下的data子目录而不再是用户的 Documents 文件夹。存储环境变量收敛为清晰的三层结构FLET_APP_STORAGE_DATA持久数据、新增的FLET_APP_STORAGE_CACHE可再生缓存、FLET_APP_STORAGE_TEMP现在指向 OS 临时目录此前指向缓存目录。flet run开发模式现在把工作目录设置为隐藏的、已被 Git 忽略的project/.flet/storage/data与打包后的应用行为保持一致。背景为什么要把应用文件从app.zip挪进 Bundle在 0.86.0 之前你的 Python 源码会被打包成app/app.zip作为 Flutter asset 分发并在首次启动时于运行时解压与此同时标准库和 site-packages 已经以解包形式放在 Bundle 内部。这种应用代码压缩、依赖解包的双轨制带来了首次启动解压延迟与哈希簿记hash bookkeeping成本。0.86.0 将应用文件处理逻辑上移到serious_python中一举移除了首次启动解压和哈希簿记并把你的代码放到了与标准库相同的位置。但正因为这个位置位于只读的 Bundle 内签名.app、iOS bundle、Program Files、APK工作目录不得不迁移到一个可写的位置——而应用数据的天然归宿就是 OS 的application support目录它在每个平台都是应用私有app-private的不会污染用户的 Documents 文件夹也无需手工做作用域隔离。迁移指南把数据写到存储目录而不是写在代码旁边应用目录是只读的。相对路径写入会解析到当前工作目录而 0.86.0 中 cwd 就是FLET_APP_STORAGE_DATA可写、持久、应用私有。因此open(app.db, w)和sqlite3.connect(app.db)仍然照常工作——文件只是不再落在你的.py文件旁边而是落在数据目录里并且在应用更新后依然保留。# 显式写法把文件放进数据目录避免依赖 cwd 语义 import os app_data_path os.getenv(FLET_APP_STORAGE_DATA) my_file_path os.path.join(app_data_path, test_file.txt) with open(my_file_path, w) as f: f.write(Some file content...)因为FLET_APP_STORAGE_DATA就是工作目录相对路径counter.txt也会解析到它内部使用os.path.join(app_data_path, ...)则是为了让意图更明确。完整的读写示例可以参考 读写文件 Cookbook其中还提供了一个计数器持久化示例应用每次点击按钮时把计数值写入数据目录中的counter.txt启动时再读回从而让计数跨启动保留。用__file__读取随应用分发的文件而不是相对路径相对读取你随应用打包的文件例如open(seed.json)时路径不再解析到应用目录。请改为相对于你的模块来读取打包数据from pathlib import Path SEED Path(__file__).parent / seed.json data SEED.read_text()或者使用importlib.resources也可以把文件放到 Flet 的assets/目录下通过FLET_ASSETS_DIR解析import os from pathlib import Path import flet as ft default_assets_dir Path(__file__).parent / assets assets_dir Path(os.environ.get(FLET_ASSETS_DIR, str(default_assets_dir))).resolve() def main(page: ft.Page): ... ft.run(main, assets_dirassets)FLET_ASSETS_DIR在flet build产出的生产应用中指向打包 assets 的绝对位置详见 环境变量参考本地运行时可能未设置因此要带 fallback。需要注意的是像Image.src这类控件属性仍应使用相对于ft.run(assets_dir...)的路径见 assets Cookbook与文件系统路径的用法不同。存储环境变量三件套变量含义生命周期FLET_APP_STORAGE_DATA持久应用数据 工作目录永不被自动删除会被备份FLET_APP_STORAGE_CACHE可再生缓存新增OS 在存储压力下可能清空FLET_APP_STORAGE_TEMPOS 临时/草稿空间变更——此前是缓存目录最易失启动之间可能消失如果你此前依赖FLET_APP_STORAGE_TEMP存放需要存活的 data它以前指向缓存目录请改用FLET_APP_STORAGE_CACHE或对必须保留的数据用FLET_APP_STORAGE_DATA。把数据库放进 cache 或 temp 目录有静默丢数据的风险——数据库、状态、配置这类必须保留的内容一律放进FLET_APP_STORAGE_DATA。在 环境变量参考 中三个变量还有更细的语义说明FLET_APP_STORAGE_CACHE预创建、应用私有对应平台的 caches 目录平台的清除缓存操作会清掉它FLET_APP_STORAGE_TEMP对应 OS 临时目录getTemporaryDirectory()在 Android 上它与FLET_APP_STORAGE_CACHE解析到同一目录且在flet run下 Python 的tempfile也会被指向这里通过TMPDIR等价于tempfile.gettempdir()。各平台的物理位置FLET_APP_STORAGE_DATA 工作目录平台位置Windows%APPDATA%\company\product\data例如C:\Users\User\AppData\Roaming\company\product\datamacOS~/Library/Application Support/bundle-id/data沙盒应用重定向进应用容器Linux${XDG_DATA_HOME:-~/.local/share}/app-id/dataiOSapp-sandbox/Library/Application Support/bundle-id/dataAndroid/data/data/package/files/dataflet run开发project/.flet/storage/dataFLET_APP_STORAGE_CACHE与FLET_APP_STORAGE_TEMP平台FLET_APP_STORAGE_CACHEFLET_APP_STORAGE_TEMPWindows%LOCALAPPDATA%\company\product%TEMP%…\AppData\Local\TempmacOS~/Library/Caches/bundle-id$TMPDIR例如/var/folders/.../T/Linux${XDG_CACHE_HOME:-~/.cache}/app-id系统临时目录$TMPDIR回退/tmpiOSapp-sandbox/Library/Caches/bundle-idapp-sandbox/tmpAndroidgetCacheDir()/data/data/package/cache与CACHE相同getCacheDir()flet run开发project/.flet/storage/cacheproject/.flet/storage/tempflet run开发模式存储用.flet/模拟打包应用flet run现在会创建隐藏的project/.flet/目录内含storage/{data,cache,temp}并以工作目录 .flet/storage/data的方式运行应用使开发行为与打包应用一致包括上面读取自带文件方式变更这一点。该目录自带.gitignore会被 Git 自动忽略旧的可见storage/目录不再使用。源码实现印证在 sdk/python/packages/flet-cli/src/flet_cli/commands/run.py 中CLI 会创建project_dir / .flet / storage下的data、cache、temp三个子目录并在.flet/.gitignore中写入*实现自我忽略即使项目根目录没有.gitignore也生效同时生成一个README.md说明该目录用途。启动子进程时同文件 start_process 方法CLI 将三个路径分别写入FLET_APP_STORAGE_DATA、FLET_APP_STORAGE_CACHE、FLET_APP_STORAGE_TEMP环境变量把TMPDIR/TEMP/TMP指向temp目录让tempfile.gettempdir()与FLET_APP_STORAGE_TEMP一致并把子进程 cwd 设为 data 目录同时把调用flet run时的原始工作目录放入PYTHONPATH确保-m模块依然可导入。在 Windows 上还会通过FILE_ATTRIBUTE_HIDDEN显式隐藏.flet/目录。源码级佐证StoragePaths 服务与 Dart 端实现除了环境变量运行时还能通过StoragePaths服务以 API 形式拿到这些路径。Python 端实现在 sdk/python/packages/flet/src/flet/controls/services/storage_paths.pyget_application_cache_directory()对应FLET_APP_STORAGE_CACHE目录不存在时自动创建get_application_support_directory()对应FLET_APP_STORAGE_DATA的父目录——FLET_APP_STORAGE_DATA指向它的data子目录get_temporary_directory()对应FLET_APP_STORAGE_TEMP文件随时可能被清空get_console_log_filename()返回缓存目录下的console.log即FLET_APP_CONSOLE环境变量指向的日志文件生产模式下设置。Dart 端在 packages/flet/lib/src/services/storage_paths.dart 基于path_provider实现get_application_cache_directory、get_application_support_directory、get_temporary_directory分别映射到各平台的 caches / application support / temp 目录get_console_log_filename用path.join拼出缓存目录下的console.log。这两处实现相互印证了环境变量 平台目录的预创建入口这一设计。需要留意的是StoragePaths的方法在 Web 模式下不可用会抛出FletUnsupportedPlatformException这也与WebPyodide存储行为不变的变更说明一致。时间线变更版本0.86.0同版本的其他破坏性变更如 Android 上 site-packages 以 zip 形式分发、默认打包 Python 版本改为 3.14、应用与包默认编译为.pyc等可参见 Flet 0.86.0 破坏性变更与弃用清单。参考资料环境变量FLET_APP_STORAGE_DATA、FLET_APP_STORAGE_CACHE、FLET_APP_STORAGE_TEMP、FLET_APP_CONSOLE、FLET_ASSETS_DIRCookbook读写文件、assets 使用打包发布发布指南、flet pack版本说明Flet 0.86.0源码CLI 开发模式存储实现见 run.pyPython 端StoragePaths服务见 storage_paths.pyDart 端实现见 storage_paths.dart赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Typeahead.js v0.10.0 迁移指南架构重构与重大变更解析Typeahead.js v0.10.0 迁移指南架构重构与重大变更解析 前言 Typeahead.js 作为一款优秀的自动补全库在 v0.10.0 版本进前端UI组件RxDB 16.0.0 升级全解析重命名重构、存储层重写与破坏性变更迁移指南RxDB 16.0.0 升级全解析重命名重构、存储层重写与破坏性变更迁移指南 RxDB 16.0.0Efficiency Redefined是一个以内部数据库NoSQL嵌入式数据库实时数据库LLMCompiler智慧银行系统多渠道交易并行处理与风险监控LLMCompiler智慧银行系统多渠道交易并行处理与风险监控 在金融科技飞速发展的今天银行系统面临着日益复杂的交易场景和严格的风险管控需求。LLMComp人工智能AI Agent工具调用上一篇3步搞定DOL-CHS-MODS一站式整合包新手必备的游戏安装指南下一篇Zotero与自然语言处理模型的高效整合智能文献处理方法论创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考