1

非常に有望に見えるシェイクを使おうとしていますが、小さな壁にぶつかりました。私はhaskellにまったく慣れていないので、明らかな何かが欠けているかもしれませんが、ここに私の問題があります:

シェイクプログラムで新しい種類のルールを定義したいと思います。このルールは、依存関係から値を計算し、それをshakeにデータベースに保存させます。したがって、依存関係が最新の場合、shakedb値は常に有効です。

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'

では、どうすれば新しいルールを定義できるでしょうか。

ボーナスの質問は次のとおりです。私のアイデアは興味深いですか、それともそれを行うためのより良い方法がありますか?シェイクの使い方を考えると、この振る舞いをするルールがたくさんありました。これにより、一時ファイルが大量に発生するのを防ぎ、シェイクデータベースを利用できます。実際、私の次のステップは、「ファイルシステムフリールール」の一般的なルールを定義することです。ユーザーはkey → Maybe (Action value)関数を提供する必要があります。

4

1 に答える 1

0

シェイク 0.4 以降でvalidStoredは、クラスから削除され、次のものRuleに置き換えられました。

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になり、既存の値は常に有効と見なされます。

これらの「キャッシュ」ルールを難しくした理由は、次の 3 つの理由から、あまり優れたアイデアではないと判断したためです。

  1. ビルド システムを作成しているときにこれらのルールのいずれかが間違っている場合は、有効な状態に戻すために Shake データベースを削除する必要があります。
  2. 生成されたものを簡単に確認できないため、大規模なマルチスレッド システムでは困難なトレースに頼らなければなりません。
  3. ビルド システムを実行するたびに、何もする必要がない場合でも、Shake はデータベース全体を逆シリアル化する必要があります。これには、格納されている大きな値が含まれます。

一時ファイルだけを使用すると、すべてがより簡単になることがわかりました。

たとえば、複雑な構造をファイルに保存する場合など、ファイルのコンテンツの逆シリアル化をキャッシュする範囲があると想像できますが、それを行うための適切な API はまだありません。

Shake 0.9 以上

関数 newCache は、ファイルのコンテンツの逆シリアル化をキャッシュする方法を提供します。

于 2013-01-31T20:09:53.087 に答える