Would it be possible to make Shake reactive, using inotify (or whatever git-annex and Yesod use) so that if ever the filesystem changes in such a way to imply that rule should execute, it does so at the earliest opportunity?
How can I use the Shake library to build a reactive build system?
473 Views Asked by John Wiegley At
1
There are 1 best solutions below
Related Questions in HASKELL
- Cabal sandbox is using a global dependency. Could not resolve
- Haskell lens: let binding of Traversal'
- How can I parse fixed-length, non-delimited integers with attoparsec?
- Pipeline-like operation using TChan
- compile-time vs. run-time cost of Hamlet templates
- Date-time package in haskell - error in the current one, can't find an analog
- How does one debug infinite recursion in Haskell?
- Force GHC using local files
- List with random numbers in Haskell
- Changes in other elements based on listbox selections in threepenny-gui
- Multithreading and gtk2hs
- Operator section for applicative with <$> and <*>
- Unable to create a custom header to use it in "withManager"
- How do I reuse an intermediate value in chain of Haskell Either binds?
- Haskell, Tree problems
Related Questions in REACTIVE-PROGRAMMING
- How to prevent Scan from running multiple times?
- Throwing data through narrow gate with Rx (Reactive Extensions)
- How cancel task with retrofit and rxjava
- Combine params from two Observables to execute the third one
- How to ensure that all observers see the same result from multiple parallel subscription
- Pub/Sub Vs Observer Vs Reactive
- RxJava- performing a peek() or void operation within an Observable chain?
- Modulating audio signal with Euterpea
- RxJS error handling
- How cancel network request in retrofit and rxjava
- Shiny R reactivevalues memory leak
- RxJava- Placing several Observable values in a static body of text?
- JavaFX and RxJava- TableView infinitely calling setCellValueFactory()
- Create Observable from side-effects in Do block
- ReactiveCocoa Combine Latest with Button press and Text Field Delegate Signal
Related Questions in SHAKE-BUILD-SYSTEM
- Shake: How to reliably, automatically force rebuild when my rules change, becoming out of sync with the shake database?
- How can I get console input mid-build in Shake?
- Avoiding oracle, OR separating oracles of the same type
- Shake - Best way to delete intermediate files?
- Small binary Shake executable
- How to run shake without stack
- Adding an extra dependency in new Rules to existing Rules
- Deploying Shake in intranet scenarios
- How to debug shake rules execution?
- How to change the information printed by Shake during a build
- How to check if running shake would rebuild a target (without actually trying to build it)?
- Why does Shake not provide a MonadMask instance for Action?
- How to show progress in Shake?
- shake: dependency on shared library that is built internally in the project
- How to output /p:Platform="Any CPU" as quoted from shake cmd?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
The author of Shake, Neil Mitchell, answered this by saying:
There are a few ways to approach this:
You could just rerun Shake every time it detects something has changed. Shake is highly optimised for fast rebuilds, if the change requires doing a compile, then the time for Shake to figure out what to rebuild is probably minimal. Requires no changes to Shake.
There are certain things Shake does on startup, like reading the Shake database. If there is demand, and that turns out to be noticeable in time, I would happily provide a rerun Shake cheaply API of some sort - it's not that difficult to do.
When Shake does do a rebuild-check, the most expensive thing it does is checking file modification times. If the inotify layer gave a list of the files that had changed I could only recheck things that had actually changed. For a massive project you're likely to see ~1s checking modification times, so it probably buys you a little, and isn't too hard to implement.
If Shake is actively building, and then something changes, you could throw an exception, kill whatever is being built, and restart Shake. Shake has been thoroughly tested with exceptions being thrown at it, and does the right thing. I know at least one person uses Shake in this way.
Finally, if Shake is actively building, you could dynamically terminate just those rules whose inputs have changed and go again. Shake could support this model, but it would be a reasonable amount of work, and require re-engineering some pieces. That would be the full reactive model, but I suspect it only starts to be a benefit when you have a massive number of files and a few files are changing almost continuously but most files aren't.
We also determined that combining Shake with a utility like Hobbes (also on Hackage) can make it possible to do reactive builds.