# DISCLAIMER: # It was late, I was tired, I don't know know enough powershell, and I got a surge of inspiration. # Looking back at it now it just feels like a bloated monstrosity. # It does, however, work pretty much as expected. Simply sourcing the file will set up and # start the filewatcher. And it does the job, albeit without any useful output from the service # or build. # But, I'm happy with this. I guess. $knownFiles = @{} Function Register-Watcher { param ($folder) $absPath = ($folder | Resolve-Path) $filter = "*.*" $watcher = New-Object IO.FileSystemWatcher $absPath, $filter -Property @{ IncludeSubdirectories = $true EnableRaisingEvents = $true } $changeAction = [scriptblock]::Create({ try { $path = $Event.SourceEventArgs.FullPath $changedAt = $Event.TimeGenerated if (Test-Path -Path $path -PathType Container) { return } if ($path -like "*~") { return } # Write-Host ($knownFiles | Format-Table | Out-String) if ($knownFiles.ContainsKey($path)) { $compareWith = $knownFiles[$path] $difference = New-TimeSpan -Start $compareWith -End $changedAt if ($difference.Seconds -lt 1) { return } } $knownFiles[$path] = $changedAt Write-Host "Updated: $path" Stop-Process -Name ergo Write-Host "Ergo stopped!" if ($path -like "*.go") { Write-Host "Rebuilding Ergo..." go build -o .\bin\ergo.exe .\cmd\ergo } Write-Host "Starting Ergo..." Start-Job -ScriptBlock{.\bin\ergo.exe -port 1337 -web-base-dir .\web} } catch { Write-Host "An error occurred:" Write-Host $_ } }) Register-ObjectEvent $Watcher -EventName "Changed" -Action $changeAction } # I know this is bad practice (unregistering _all_ events), but works for me. Get-EventSubscriber | Unregister-Event Get-Job | Remove-Job -Force Register-Watcher .\cmd Register-Watcher .\web