You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令完成包含补丁执行的全流程,可以通过应用的安装钩子实现:
    1. 在自定义应用的hooks.py中注册after_install钩子:
      after_install = "custom_app.install.run_patches_on_install"
      
    2. 在对应路径下实现钩子函数,调用框架原生的补丁执行方法:
      # 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:33:33