我正在编写一个 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 规则,只是扩展它以添加额外的依赖项。