2013-01-31 58 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

是的,如果它是一个真正的分贝,那么可能会有方法查看其中的内容,从而解决了大部分这些问题。我不知道对性能的影响会是怎样(摇一摇),但它会带来一些好处。 –