Plugin API 参考
本文基于 Reference/FolderRewind/FolderRewind/Services/Plugins/IFolderRewindPlugin.cs 的当前实现整理,目标是让你能直接开始写可用插件。
接口定位
IFolderRewindPlugin 是插件主入口,负责:
- 插件元信息与设置定义
- 生命周期初始化
- 备份/还原钩子
- 配置类型发现与批量创建
- (可选)完整接管备份/还原
最小实现(必须项)
public class MyPlugin : IFolderRewindPlugin
{
public PluginInstallManifest Manifest { get; } = new()
{
Id = "com.example.myplugin",
Name = "MyPlugin",
Version = "1.0.0",
Author = "You",
Description = "My first plugin"
};
public IReadOnlyList<PluginSettingDefinition> GetSettingsDefinitions()
=> new List<PluginSettingDefinition>();
public void Initialize(IReadOnlyDictionary<string, string> settingsValues) { }
public string? OnBeforeBackupFolder(BackupConfig config, ManagedFolder folder,
IReadOnlyDictionary<string, string> settingsValues)
=> null;
public void OnAfterBackupFolder(BackupConfig config, ManagedFolder folder,
bool success, string? generatedArchiveFileName,
IReadOnlyDictionary<string, string> settingsValues) { }
public IReadOnlyList<ManagedFolder> TryDiscoverManagedFolders(string selectedRootPath,
IReadOnlyDictionary<string, string> settingsValues)
=> new List<ManagedFolder>();
}
成员详解
Manifest
用于 UI、日志、兼容性检查。建议至少完整填写:
Id:全局唯一,建议反向域名风格Version:语义化版本EntryAssembly、EntryType:需与manifest.json一致MinHostVersion:声明最低宿主版本
GetSettingsDefinitions()
返回插件设置定义。Host 会保存用户输入,并在调用插件方法时通过 settingsValues 回传。
实战建议:
- Key 一旦发布尽量保持稳定
- Boolean 默认值统一用字符串
"true"/"false" - 为设置写清用途与副作用
Initialize(settingsValues)
插件启用时触发一次。常见用途:
- 读取并缓存设置
- 预热状态
- 一次性修正历史配置
MineRewind 在此处读取 EnableHotBackup 与 PreservePlayerData,并修复相关过滤规则。
SetHostContext(hostContext)(可选)
宿主注入上下文后,插件可主动执行:
BroadcastEvent广播信号QueryKnotLinkAsync请求-响应SubscribeSignal订阅信号LogInfo/LogWarning/LogError记录插件日志
备份钩子
OnBeforeBackupFolder(...)
- 返回
null:继续使用原路径 - 返回新路径:Host 将改用该路径作为备份源
常见用法:
- 快照目录替换
- 备份前通知外部程序先落盘
OnBeforeBackupFolderAsync(...)
Host 优先调用异步版本(默认回退同步版本)。
适用场景:
- 需要
PluginHostContext参与 KnotLink 交互 - 需要短时异步 I/O
OnAfterBackupFolder(...)
用于收尾:
- 清理临时快照
- 写入附加元数据
- 记录结果日志
还原钩子
OnBeforeRestoreFolder(...)
可返回任意状态对象(object),并在还原后传回。
MineRewind 用它提前提取玩家数据快照。
OnAfterRestoreFolder(...)
收到前置状态对象后可进行写回或后处理。
MineRewind 在此将保留的玩家数据写回 level.dat。
配置类型与发现
GetSupportedConfigTypes() + CanHandleConfigType(...)
用于定义插件专属配置类型。MineRewind 返回 Minecraft Saves。
TryDiscoverManagedFolders(...)
用户选择目录后,插件可自动发现可管理文件夹列表。
TryCreateConfigs(...)
用于一键批量创建 BackupConfig。若处理成功,返回:
Handled = trueCreatedConfigs = [...]- 可选
Message
完整接管流程(高级)
当以下方法返回 true 时,Host 不再走内置引擎:
WantsToHandleBackup(config)WantsToHandleRestore(config)
随后调用:
PerformBackupAsync(...)->PluginBackupResultPerformRestoreAsync(...)->PluginRestoreResult
推荐在你需要自定义归档格式、远程存储、特殊校验时使用。
调用时序(简化)
- 启用插件 ->
Initialize - 配置创建阶段 ->
TryDiscoverManagedFolders/TryCreateConfigs - 备份阶段
- 若接管:
PerformBackupAsync - 否则:
OnBefore...-> 内置备份 ->OnAfter...
- 若接管:
- 还原阶段同理
常见坑
- 在钩子中阻塞过久:会拖慢整体任务
- 未处理异常:插件抛错会影响用户体验
settingsValues解析不健壮:建议容错"1"/"0"/大小写- 版本声明过宽:可能在旧 Host 上调用失败