2013-01-31 64 views
1

我正在嘗試使用Shake,這看起來很有希望,但是我碰到了一堵小牆。我對哈斯克爾相當陌生,所以也許我錯過了一些明顯的東西,但這裏是我的問題:如何在Shake中定義自定義規則:Development.Shake.Core隱藏

我想在我的搖動程序中定義一種新的規則。這條規則會從依賴關係中計算出一個值,並讓它存儲在數據庫中。所以如果依賴關係是最新的,那麼shake db值總是有效的。

data PrjList = PrjList FilePath deriving (Typeable,Show,Eq,Hashable,Binary,NFData) 

instance Rule PrjList [(String,FilePath)] where 
    validStored q a = True 

-- Generate the dependency 
getProjectList :: FilePath -> Action [(String,FilePath)] 
getProjectList dir = apply1 $ PrjList dir 

-- We want to traverse recursivly all subdir but stop once we find a BuildConfig file 
defaultProjectList :: Rules() 
defaultProjectList = defaultRule $ \(PrjList dir) -> Just $ do 
    -- blabla... 
    return [] 

但是,如果我嘗試import Development.Shake.Core我有

Could not find module `Development.Shake.Core' 
It is a member of the hidden package `shake-0.7'. 
it is a hidden module in the package `shake-0.7' 
it is a hidden module in the package `shake-0.8' 
Use -v to see a list of the files searched for. 

,如果我不進口的話,我有

`validStored' is not a (visible) method of class `Rule' 

那麼一個人如何可以定義新規則?

獎金的問題是:我的想法是有趣的還是有更好的方法來做到這一點?當考慮如何使用搖,我有很多規則會有這種行爲。這避免了大量的臨時文件並利用shake db。事實上,我的下一步是嘗試爲「文件系統免費規則」定義一個通用規則。用戶只需提供一個key → Maybe (Action value)函數。

回答

0

在抖動0.4及以上validStoredRule類中刪除,並替換爲:

storedValue :: key -> IO (Maybe value) 

因此,而不是定義的值是否仍然正確與否,將返回存儲的值。這使得你想要做的更難一點,但仍然有可能。您可以定義value類型:

data MyValue a = RealResult a | Cheat 
instance Eq a => Eq (MyValue a) where 
    RealValue a == RealValue b = a == b 
    _ == _ = True 

現在,您可以定義storedValue _ = return $ Just Cheat,和現有的值將始終被視爲有效。

之所以提出這些「緩存」規則更難,是因爲我決定他們是不是個好主意,原因有三:

  1. 如果你得到的這些規則錯了,因爲你正在寫的一個構建系統,您必須刪除Shake數據庫才能恢復到有效狀態。
  2. 你不容易看到生成了什麼,所以不得不求助於在大型多線程系統中很難的跟蹤。
  3. 在構建系統的每一次運行中,即使無所事事,Shake必須對整個數據庫進行反序列化,包括您存儲在那裏的任何大值。

我發現如果你只是使用臨時文件,一切都變得更直接了。

我可以想象有一些緩存文件內容反序列化的範圍,例如,如果你要在一個文件中存儲複雜的結構,但是我還沒有一個好的API來做到這一點。

在搖動0。9以上

函數newCache提供緩存文件內容反序列化的方法。

+0

感謝您的快速和全面的反應! –

+0

(編輯:S最大5分鐘)我想我可以創建大量的小文件。我認爲這個趨勢更傾向於把事情放在數據庫中以提高性能,但現在我明白了你的觀點。也許使用像編譯工具和分頁的sqlite這樣的'真正'db可以解決這些問題(如果以人類可讀形式序列化的值更多)。 –

+0

是的,如果它是一個真正的分貝,那麼可能會有方法查看其中的內容,從而解決了大部分這些問題。我不知道對性能的影響會是怎樣(搖一搖),但它會帶來一些好處。 –