我正在编写一个Shakefile,目的是使它可以使用新的Rules
进行扩展。它的接口是一个函数mainFor :: Rules () -> IO ()
,其思想是客户项目只需要定义main = mainFor myCustomRules
就可以使整个工作正常进行。 mainFor customRules
被定义为一连串的震动Rules
,然后调用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"]
但这并不令人意外,因为mainFor
中的stock规则和customRules
参数中传递的第二个自定义规则都针对同一目标。 请注意,我不想完全覆盖库存规则,而只是扩展它以添加额外的依赖关系。
答案 0 :(得分:1)
当前无法使用Shake进行此操作。可能性是:
FilePath -> Action ()
函数,然后定义自己的%>
并将该函数应用于输出。它仅适用于预先选择的扩展点,但是如果在文件顶部重新定义%>
,它将击中所有实例。shakeExtra
以某种方式存储状态。