Frappe安装自定义应用时patches补丁未执行如何解决
该现象是否属于Frappe正常行为
这是Frappe框架的默认设计逻辑,属于预期内的正常行为。
Frappe的install-app流程核心逻辑是同步应用的元数据结构(包括DocType、报表、页面、角色权限等初始定义),不会触发patches.txt中定义的补丁执行逻辑。框架默认将补丁执行入口绑定在bench migrate流程中:执行迁移时系统会遍历所有已安装应用的patches.txt文件,和patchLog表的执行记录做比对,仅运行记录不存在的补丁。
你观察到的patchLog表已有对应条目但补丁未执行的情况,本质是install-app阶段根本不会进入补丁扫描、执行的代码分支,和表内是否已有记录无关。
安装阶段执行补丁的配置方案
你可以根据实际场景选择以下两种方案:
- 方案1:安装命令串联迁移流程
这是官方推荐的无侵入标准方案,安装应用后直接追加执行迁移命令即可自动触发补丁运行:bench --site [sitename] install-app custom-app && bench --site [sitename] migrate
该方案不需要修改应用代码,和框架原生逻辑完全兼容,适合绝大多数场景。 - 方案2:通过安装钩子主动触发补丁执行
如果需要单条install-app命令完成包含补丁执行的全流程,可以通过应用的安装钩子实现:- 在自定义应用的
hooks.py中注册after_install钩子:after_install = "custom_app.install.run_patches_on_install" - 在对应路径下实现钩子函数,调用框架原生的补丁执行方法:
# custom_app/install.py import frappe from frappe.modules.patch_handler import run_patches def run_patches_on_install(): # 仅执行当前自定义应用的待运行补丁 run_patches(app_name="custom_app", force=False)
- 在自定义应用的
额外提醒:不要提前手动向patchLog表写入补丁记录,框架会以该表记录作为补丁是否执行的唯一判断依据,提前写入会导致补丁在迁移流程中也被跳过。
内容的提问来源于stack exchange,提问作者Nehal Damania
相关产品推荐
相关产品推荐

