我正在尝试使用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)
函数。
感谢您的快速和全面的反应! –
(编辑:S最大5分钟)我想我可以创建大量的小文件。我认为这个趋势更倾向于把事情放在数据库中以提高性能,但现在我明白了你的观点。也许使用像编译工具和分页的sqlite这样的'真正'db可以解决这些问题(如果以人类可读形式序列化的值更多)。 –
是的,如果它是一个真正的分贝,那么可能会有方法查看其中的内容,从而解决了大部分这些问题。我不知道对性能的影响会是怎样(摇一摇),但它会带来一些好处。 –