-1

new で拡張可能にすることを目的として Shakefile を作成していRulesます。そのインターフェースは functionであり、クライアント プロジェクトはすべてを機能mainFor :: Rules () -> IO ()させるために定義するだけでよいという考えです。の呼び出しが続くShake の束として定義されます。main = mainFor myCustomRulesmainFor customRulesRulescustomRules

mainForこれは、渡されたカスタム ルールが新しいターゲット用である限り機能します。

ただし、私のストック (非カスタム) ルールの一部は、基本的に「この入力でこの大きな不透明な独自の外部スクリプトを実行し、最善を尽くす」という形式になっています。入力に応じて、外部スクリプトによって使用される追加のファイルが存在する可能性があります。たとえば、次の形式のルールがあるとします。

"_build/output.bin" %> out -> do
    need ["_build/script.scr", "_build/src/generated.src"]
    runExternalScript

特定のクライアント プロジェクトでは、生成されたソース コードに別のファイルへの参照が含まれている場合があります_build/src/extrainput.src。したがって、 に渡されるカスタム ルールではmainFor、このファイルに追加のルールが必要なだけでなく、既存のルールも変更して、needこの入力であることを示す必要があります。

main = mainFor $ do
    "_build/src/extrainput.src" %> \out -> do
       generateExtraSrc

    "_buld/output.bin" %> \out -> do
      need ["_build/src/extrainput.src"]

しかし、当然のことながら、引数でmainFor渡されたストック ルールと 2 番目のカスタム ルールの両方が同じターゲットに対するものであるため、これは失敗します。ストック ルールを完全にオーバーライドするのではなく、拡張して追加の依存関係を追加するだけであることに注意してください。customRules

4

1 に答える 1

1

現在、Shake を使用してこれを行う方法はありません。可能性は次のとおりです。

  • シェイクに加えます。それが正しいかどうかは、この要件がどれほど一般的かによって異なりますが、私の推測は比較的まれですが、検証が必要です。ルールの前に依存関係を実行する必要があるという事実は、より懸念されます。結果を生成する複数のアクションを提供するよりも、何らかの形で構成的ではありません。
  • 外側で行います。私のストローマンは、「エクストラ」をある種の関数として記述し、その関数を出力に適用FilePath -> Action ()する独自のものを定義することです。%>事前に選択された拡張ポイントでのみ機能し%>ますが、ファイルの先頭で再定義すると、すべてのインスタンスにヒットする可能性があります。
  • 本当にもっと隠したい場合はshakeExtra、何らかの方法で状態を保存するために使用します。
于 2018-10-12T12:37:13.103 に答える