跳到主要内容

猴子补丁和Patches的区别

在 Frappe 和 ERPNext 中,Monkey Patching 和 patches.txt 文件中的补丁是两种不同的方法,用于不同的目的。让我们详细探讨一下这两种方法及其区别。

Monkey Patching

定义: Monkey Patching 是一种在运行时动态修改模块或类的方法。它允许你在不修改原始代码的情况下覆盖或扩展现有方法或属性。

使用场景:

  • 需要在运行时动态修改或扩展框架或库的行为。
  • 需要覆盖现有的类或方法,而不希望修改框架或库的源代码。
  • 适用于需要在应用启动时自动应用的修改。

实现方式:

  • 通过在模块加载时替换目标方法或属性。
  • 通常在 __init__.py 或类似的初始化文件中实现。

示例:

python复制代码# 在自定义应用程序的 __init__.py 文件中

import frappe
import os
import importlib
from frappe.integrations.doctype.s3_backup_settings import s3_backup_settings

def custom_upload_file_to_s3(filename, folder, conn, bucket):
s3_key_prefix = frappe.db.get_single_value('S3 Backup Settings', 's3_key_prefix') or 'backups/'
storage_class = frappe.db.get_single_value('S3 Backup Settings', 'storage_class') or 'STANDARD'
destpath = os.path.join(s3_key_prefix, folder, os.path.basename(filename))

try:
print("Uploading file:", filename)
extra_args = {'StorageClass': storage_class}
conn.upload_file(filename, bucket, destpath, ExtraArgs=extra_args)
except Exception as e:
frappe.log_error()
print("Error uploading: %s" % (e))

def apply_patch():
s3_backup_settings.upload_file_to_s3 = custom_upload_file_to_s3
print("Patched upload_file_to_s3 method")

apply_patch()

patches.txt

定义: patches.txt 是 Frappe 框架用于管理数据库模式更改和其他需要在特定时间点执行的一次性操作的机制。每个补丁都是一个 Python 脚本,包含一个 execute 函数。

使用场景:

  • 需要对数据库模式进行更改,如添加或修改表结构。
  • 需要进行一次性的数据迁移或清理。
  • 适用于需要在安装或升级时运行的操作。

实现方式:

  • 补丁定义在应用程序的 patches.txt 文件中。
  • 每个补丁都是一个带有 execute 函数的 Python 脚本,Frappe 在迁移时会自动运行这些补丁。

示例:

python复制代码# 在自定义应用程序的 patches/custom_patch.py 文件中

def execute():
# 执行一次性操作,例如修改数据库结构
frappe.db.sql("ALTER TABLE `tabYourDoctype` ADD COLUMN `new_column` VARCHAR(255);")
print("Custom patch executed")

patches.txt 中添加条目:

plaintext
复制代码
your_custom_app.patches.custom_patch.execute

区别

特性Monkey Patchingpatches.txt
目的动态修改或扩展现有方法或属性一次性数据库模式更改或数据迁移
应用时机应用启动时安装或升级时
典型使用场景覆盖框架或库中的方法数据库模式更改、数据迁移
实现方式在模块加载时替换方法或属性patches.txt 中定义补丁,包含 execute 函数
示例覆盖 upload_file_to_s3 方法添加数据库列

选择何时使用

  • Monkey Patching 适用于需要在运行时动态覆盖或扩展框架或库的方法,尤其是当你不希望或不能修改原始代码时。
  • patches.txt 适用于一次性的数据迁移或数据库模式更改,在安装或升级时需要执行。

通过这两种方法,你可以灵活地在 Frappe 和 ERPNext 中进行自定义,以满足特定需求。根据具体情况选择合适的方法,可以确保你的修改在正确的时间点生效。如果有任何问题或需要进一步帮助,请随时告知。