-1

我正在编写一个 Shakefile,目的是使它可以用 new 扩展Rules。它的接口是一个函数mainFor :: Rules () -> IO (),其想法是客户项目只需要定义main = mainFor myCustomRules就可以让整个事情正常工作。mainFor customRules被定义为一堆 ShakeRules然后调用customRules.

只要传递给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"]

但是,不出所料,这会失败,因为参数中的 stock 规则mainFor和第二个自定义规则customRules都针对同一个目标。请注意,我不想完全覆盖 stock 规则,只是扩展它以添加额外的依赖项。

4

1 回答 1

1

目前没有办法使用 Shake 来做到这一点。可能性是:

  • 将其添加到摇晃中。这是否正确取决于这个要求有多普遍——我的猜测是相对罕见的——但这需要验证。您希望依赖项在规则之前运行的事实更令人担忧——它在某种程度上比仅仅提供多个共同产生结果的动作要少。
  • 在外面做。我的稻草人会将“附加”编写为某种FilePath -> Action ()函数,然后定义自己的函数,%>并将该函数应用于输出。它仅适用于预先选择的扩展点,但如果您%>在文件顶部重新定义它可以命中所有实例。
  • 如果您真的想隐藏更多,请使用shakeExtra以某种方式存储状态。
于 2018-10-12T12:37:13.103 回答