2013-08-01 52 views
5

使用inotify(或任何git-annex和Yesod的用法)可以使Shake成爲被動的,以便如果文件系統以這種方式變化以暗示該規則應該執行,它會盡早執行?如何使用Shake庫構建反應式構建系統?

有接近這幾種方法:

+4

這個問題似乎是無關緊要的,因爲它是針對Shake的功能請求,而不是編程問題。 –

+2

@PetrPudlák我將這個問題解釋爲「我如何使用Shake庫構建反應式構建系統」,因爲至少有一個答案不需要新的功能。 –

回答

8

搖,尼爾·米切爾的作者,說回答了這個

  1. 你可以只重新運行Shake中的每它檢測到的東西已經 改變時。 Shake針對快速重建進行了高度優化,如果更改 需要進行編譯,那麼Shake找出要重建的 的時間可能極少。不需要對Shake進行更改。

  2. Shake在啓動時會執行某些操作,例如讀取Shake數據庫的 。如果有需求,那麼我會很樂意提供一種重新運行的Shake廉價的API 某種 - 這不是很難做到。

  3. 當Shake執行重建檢查時, 所做的最昂貴的事情是檢查文件修改時間。如果inotify圖層給出了 已更改的文件列表,我只能重新檢查 實際上已更改的內容。對於一個龐大的項目,您可能會看到檢查修改時間,因此它可能會爲您帶來一點點收益,並且 也不難實現。

  4. 如果顫積極建設,然後有新的變化,你可以 拋出一個異常,殺無論是正在興建,並重新啓動 搖。 Shake已經過全面測試,除了被拋出 之外,並做了正確的事情。我知道至少有一個人以這種方式使用Shake 。

  5. 最後,如果搖正在積極打造,你可以動態 終止只是那些投入已經改變,再去規則。搖搖可以支持這種模式,但這將是一個合理的數量 的工作,並需要重新設計一些作品。這將是完整的 被動模式,但我懷疑它只是在 有大量文件並且有幾個文件連續變化幾乎 時纔開始有益,但大多數文件不是。

我們還確定,搖勻後像霍布斯(也Hackage)實用相結合可以使人們有可能做到反應生成。

+1

我使用Shake作爲構建管理器,第2步對我來說佔用了大約300ms,這對於任何合理的自動輪詢方法來說都太慢。 – nominolo

+0

@nominolo如果對你很重要,請告訴我,我會重做API以避免重新運行的開銷。如果你的用例有一個Haskell配置文件,我很樂意看到它,因爲它可能會在300毫秒內識別出其他問題。 –