2013-08-30 26 views
2

搖具有shakeVersion :: String搖:如何在我的規則改變時自動強制重建,與搖動數據庫不同步?

默認爲1.您的構建規則的版本號。 將版本號更改爲強制完成重建,,例如對需要擦拭的規則進行重大更改。版本號應該在源代碼中設置,而不是在命令行上傳遞。

這是令人難以置信的容易提高構建系統一點,並沒有注意到他們需要擦拭顯著的變化。如果您通過版本控制來分發這些內容,則可能會導致我的同事和我的持續集成機器人生成不正確的內容。

雖然我通過刪除.shake.database來修復我自己的版本,但將此傳達給整個公司並不好玩。

我該如何自動處理?

回答

2

這是我設法在https://github.com/ndmitchell/shake/issues/59;它可能是更容易發現它比計算器在一個封閉的問題:


假設我搖規則是Build.hs

我用的Build.hs本身的哈希作爲shakeVersion

{-# LANGUAGE TemplateHaskell #-} 

import qualified Data.ByteString as BS 
import Development.Shake.Classes (hashWithSalt) 
import Language.Haskell.TH 

-- | The name of this file we are in. 
_THIS_FILE_NAME :: String 
_THIS_FILE_NAME = $(LitE . StringL . loc_filename <$> location) 

main = do 
    checksum <- dropWhile (== '-') . show . hashWithSalt 0 <$> BS.readFile _THIS_FILE_NAME 

    shakeArgs shakeOptions 
     { shakeVersion = "hash-" ++ checksum ++ "-" ++ _THIS_FILE_NAME 
     } $ do ... 

這樣的版本,當我改變我搖碼自動改變,我從來不用擔心手動撞到它。


UPDATE:現在有在shake功能getHashedShakeVersion,使做以下一點更容易。

+1

我更新了'hashable'中的'hashWithSalt'的代碼,從'Shake.Classes'重新導出。 – nh2