当 Mac 上的文件监视器遗漏编辑时,首先确定变更是否到达了受监视的文件夹、应用程序是否能看到文件系统事件,以及它是否过滤或未能处理这些事件。在较小的已知文件中复现一次遗漏的变更,然后将该结果与大型项目中的文件进行比较。这一顺序有助于将项目配置与事件传递以及应用程序处理分离开来。

1. 确认确切路径与变更

在受影响的应用程序中,检查哪个文件夹作为工作区打开,并确认编辑的文件位于该文件夹内。文件可能显示在编辑器中,但实际上位于受监视的根目录之外;符号链接的行为也可能与普通的嵌套文件夹不同。例如,VS Code 文档指出,其 macOS 监视器使用 FSEvents,不会自动跟踪符号链接,且其监视器排除设置可能会忽略某些路径。这些细节适用于 VS Code,而非所有 Mac 应用程序,因此请检查你所用工具中对等的工作区和排除设置。VS Code: File Watcher Issues

直接在项目内部保存对某个文件的简单修改,然后检查应用程序是否做出反应。如果只有生成的、被忽略的、链接的或深度嵌套的路径出现故障,在将其归咎为整个 macOS 系统的问题之前,请先调查该路径的包含情况及其与工作区根目录的关系。如果项目位于映射的网络驱动器上或使用第三方文件系统,请在 Mac 的本地磁盘上测试一个副本。VS Code 警告称这些文件系统不保证能产生事件;这应当作为对比环境的理由,而不是证明每个此类卷都会失效的证据。

2. 检查应用程序是否收到了事件

文件系统通知并不承诺每次单独编辑都有一个精确的回调。Apple 的 FSEvents 文档指出,事件可能会被合并;当设置了 MustScanSubDirs 标志时,客户端必须递归地重新扫描指定的目录。丢弃事件(dropped-event)标志表示存在缓冲问题,需要对受监视的目录进行完整扫描。这意味着一个运行良好的监视器需要对账目录的当前内容,而不是仅仅依赖完美的通知序列。Apple: Using the File System Events API,Apple: FSEventStreamEventFlags

在遗漏变更的应用程序中查找监视器日志或诊断信息。对于 VS Code,其文档介绍了如何启用详细的文件监视器日志记录并检查相关的日志输出。其他应用程序可能会提供不同的诊断信息,或者根本不提供。如果日志报告了丢弃事件、排除项、过期的根目录或监视器错误,请保留该消息并按照应用程序自身的恢复步骤操作;重启监视器或应用程序可以作为一个有用的对照比较,但本身无法确定根本原因。

3. 使用 fs_usage 检查文件系统活动

macOS 包含了 fs_usage,用于显示当前与文件系统相关的系统调用活动。它可以帮助确认相关应用程序在复现过程中是否在触及文件,但它不是 FSEvents 事件查看器,无法证明监视器是否接收或处理了通知。Apple 指出存在访问控制限制,且可能需要 root 权限。Apple: Examining File-System Usage

在终端中复现问题的同时观察指定的应用程序。将 YourApp 替换为其真实的进程名称(例如,应用程序的进程名称可能与其显示名称不同):

sudo fs_usage -w YourApp

在短暂复现后,使用 Control-C 停止实时显示。输出内容可能会非常繁杂,因此请专注于编辑发生的时间和相关路径。如果不确定进程名称,请查阅应用程序的文档或“活动监视器”;不要以为按猜测的名称过滤就能显示正确的进程。fs_usage 是用于文件活动的诊断辅助工具,而不是重置或修复监视器的命令。

4. 比较规模与访问条件

在应用程序可以监视的小型本地测试文件夹中重复相同的编辑。如果该测试正常而大型项目失败,请对比项目特有的排除项、符号链接、生成的目录以及任何远程或由提供程序支持的路径。庞大的目录树会给事件处理和重新扫描带来更多工作量;Apple 的指南明确指出,通知可能需要递归扫描,而应用程序自行决定如何处理该工作。单凭规模相关性并不能证明存在操作系统事件队列限制。

检查受影响的应用程序是否可以访问项目所在位置。macOS 的隐私控制和 App Sandbox 规则可能会限制对文件夹的访问,Apple 文档指出访问受保护的位置可能需要在“系统设置”中获得用户授权。在系统设置 > 隐私与安全性下检查应用程序的权限状态,并仅授予该任务所需的访问权限。权限问题可能会阻止有效的文件访问,即使该路径在应用程序中可见。Apple: Accessing Files from the macOS App Sandbox

5. 根据证据选择下一步

如果小型本地文件夹可以正常工作,请向应用程序开发者发送一个最小复现用例,包括项目位置类型、受影响的路径模式、相关监视器日志,以及是否涉及符号链接或排除项。如果小型和大型本地文件夹均失败,请更新应用程序并检查其针对特定 macOS 版本的议题跟踪器(issue tracker)或支持指南;报告 macOS 版本和应用程序版本。避免为了推测性修复而删除项目数据或更改系统安全设置。有价值的诊断是能够以最狭窄的条件进行复现:一个应用、一个路径、一次编辑和一个可观察到的故障。

来源