in src/WebJobs.Script.WebHost/FileMonitoringService.cs [266:323]
private void OnFileChanged(FileSystemEventArgs e)
{
// We will perform a host restart in the following cases:
// - the file change was under one of the configured watched directories (e.g. node_modules, shared code directories, etc.)
// - the host.json file was changed
// - a function.json file was changed
// - a proxies.json file was changed
// - a function directory was added/removed/renamed
// A full host shutdown is performed when an assembly (.dll, .exe) in a watched directory is modified
string changeDescription = string.Empty;
string directory = GetRelativeDirectory(e.FullPath, _scriptOptions.RootScriptPath);
string fileName = Path.GetFileName(e.Name);
bool shutdown = false;
if (_scriptOptions.WatchDirectories.Contains(directory))
{
changeDescription = "Watched directory";
}
else if (string.Equals(fileName, ScriptConstants.AppOfflineFileName, StringComparison.OrdinalIgnoreCase))
{
// app_offline.htm has changed
// when app_offline.htm is created, we trigger
// a shutdown right away so when the host
// starts back up it will be offline
// when app_offline.htm is deleted, we trigger
// a restart to bring the host back online
changeDescription = "File";
if (File.Exists(e.FullPath))
{
TraceFileChangeRestart(changeDescription, e.ChangeType.ToString(), e.FullPath, isShutdown: true);
Shutdown();
}
}
else if (_scriptOptions.WatchFiles.Any(f => string.Equals(fileName, f, StringComparison.OrdinalIgnoreCase)))
{
changeDescription = "File";
}
else if ((e.ChangeType == WatcherChangeTypes.Deleted || Directory.Exists(e.FullPath))
&& !_rootDirectorySnapshot.SequenceEqual(Directory.EnumerateDirectories(_scriptOptions.RootScriptPath)))
{
// Check directory snapshot only if "Deleted" change or if directory changed
changeDescription = "Directory";
}
if (!string.IsNullOrEmpty(changeDescription))
{
string fileExtension = Path.GetExtension(fileName);
if (!string.IsNullOrEmpty(fileExtension) && ScriptConstants.AssemblyFileTypes.Contains(fileExtension, StringComparer.OrdinalIgnoreCase))
{
shutdown = true;
}
TraceFileChangeRestart(changeDescription, e.ChangeType.ToString(), e.FullPath, shutdown);
ScheduleRestartAsync(shutdown).ContinueWith(t => _logger.LogError(t.Exception, $"Error restarting host (full shutdown: {shutdown})"),
TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnFaulted);
}
}