2015-08-21 97 views
2

我試圖找出我如何可以從進展型(在Development.Shake.Progress)進度信息輸出它執行命令。可能期望的輸出將是:如何在搖動中顯示進度?

[1/9] Compiling src/Window/Window.cpp 
[2/9] Compiling src/Window/GlfwError.cpp 
[3/9] Compiling src/Window/GlfwContext.cpp 
[4/9] Compiling src/Util/MemTrack.cpp 
... 

現在我模擬此使用一些IOREF,保持總(最初設置爲源文件的總和)和計數,我執行每個構建命令之前增加,但這對我來說似乎是一個駭人聽聞的解決方案。

在這個解決方案的頂部似乎正確地清潔構建工作,但行爲不端偏基礎,因爲所顯示的金額仍然是總的所有的源文件。

通過訪問Progress數據類型,我將能夠使用它的countSkipped,countBuild和countTodo成員正確計算此分數(請參閱Progress.hs:53),但我仍然不確定如何實現此目的。

任何幫助表示讚賞。 Progress類型的

+0

似乎有不爲那麼多的支持。請參閱https://groups.google.com/forum/#!topic/shake-build-system/ZPyTIfVL-dA以獲取關於搖動郵件列表上相關提案的最新討論。 –

回答

1

值是目前僅可作爲一個參數存儲在shakeProgress的功能。您可以獲取Progress,只要你想:

{-# LANGUAGE RecordWildCards #-} 
import Development.Shake 
import Data.IORef 
import Data.Monoid 
import Control.Monad 

main = do 
    ref <- newIORef $ return mempty 
    shakeArgs shakeOptions{shakeProgress = writeIORef ref} $ do 
     want ["test" ++ show i | i <- [1..5]] 
     "test*" %> \out -> do 
      Progress{..} <- liftIO $ join $ readIORef ref 
      putNormal $ 
       "[" ++ show (countBuilt + countSkipped + 1) ++ 
       "/" ++ show (countBuilt + countSkipped + countTodo) ++ 
       "] " ++ out 
      writeFile' out "" 

在這裏,我們創建一個IORef到松鼠遠傳給shakeProgress參數,然後運行該規則時,取回後。運行上面的代碼中,我看到:

[1/5] test5 
[2/5] test4 
[3/5] test3 
[4/5] test2 
[5/5] test1 

運行在並行的更高水平給出了不太精確的結果 - 最初出現在待辦事項只有3項(搖增量countTodo在找到項目的待辦事項,並儘快派生項目它知道它們中的任何一個),並且在相同索引下經常運行兩個規則(沒有關於正在進行多少的信息)。瞭解您的特定規則後,您可以細化輸出,例如存儲一個IORef你增加,以確保索引是單調的。

原因這個代碼是有點令人費解的是,Progress信息的目的是用於異步進度消息,雖然你的做法似乎完全有效的。可能值得引入同步進度消息的getProgress :: Action Progress函數。

+0

夢幻般的解決方案!仍然會是不錯的一個syncronous版本,你說.. – Fr0stBit

+0

@TheArtist:我提出一票,將其添加 - 應該不會太難:https://github.com/ndmitchell/shake/issues/293 –

+0

我會說這種方法對於更復雜的構建系統來說效果並不好,因爲可能有大量的規則你不想打印輸出,但他們會在計數中出現。 (另外,countTodo並不完全準確。) –

相關問題