为什么ServiceStack Razor FileSystemWatcher不能在Mono + Mac OS X上运行?

Aar*_*rch 3 macos mono servicestack

ServiceStack对Razor v2的新支持使用a FileSystemWatcher来检测对跟踪视图文件的更改并将其标记为无效,以便在下次请求时重新编译它们.

这非常适合调试,因为它允许您编辑视图而不是重建/重新启动项目.

在我的Mac OS X(Mountain Lion)上的Mono(目前运行3.0.10)上,显然存在Mono错误,其中FileSystemWatcher不会引发Changed文件更改事件.此外,它也不会为子目录中的文件引发任何事件,即使IncludeSubdirectories设置为true也是如此.

Aar*_*rch 5

在调查和测试了各种各样的东西后,我发现了一些针对Mono的旧版bug报告,说明FileSystemWatcher功能失败.

可以在Mono源中找到问题的解决方法:https: //github.com/mono/mono/blob/master/mcs/class/System/System.IO/FileSystemWatcher.cs

string managed = Environment.GetEnvironmentVariable ("MONO_MANAGED_WATCHER");
...
if (String.Compare (managed, "disabled", true) == 0)
    NullFileWatcher.GetInstance (out watcher);
else
    DefaultWatcher.GetInstance (out watcher);
Run Code Online (Sandbox Code Playgroud)

如果您将环境变量设置MONO_MANAGED_WATCHER为任何内容(我将其设置为"enabled"),那么它将使用DefaultWatcher哪个是托管实现,并且它适用于Mac OS X.

所以在我的应用程序启动期间,我补充说

Environment.SetEnvironmentVariable("MONO_MANAGED_WATCHER", "enabled");
Run Code Online (Sandbox Code Playgroud)

瞧,保存新版本后,我的Razor视图会被重新编译.:)