如何删除无法构建的目标?

How to delete unbuildable goal?

我想删除不再有源但没有清理的文件。

是否支持部分清理增量构建?在这种情况下,我想我可以与以前构建中使用的一组源文件进行比较,并定义如何清理那些已经消失的文件。

main = shakeArgs shakeOptions { shakeVerbosity = Diagnostic } $ do
    want [".build"]
    phony ".build" $ do
      files <- getDirectoryFiles "." ["//*.txt"]
      let goals = map (-<.> "") files
      need goals
    "*" %> \out -> do
      Stdout o <- cmd $ "sort " ++ (out ++ ".txt")
      writeFile' out o

使用 shakeArgsPrune 您可以定义一个函数,该函数随后会传递实时文件。然后你可以这样写:

import Development.Shake
import Development.Shake.FilePath
import Development.Shake.Util
import System.Directory.Extra
import Data.List
import System.IO

pruner :: [FilePath] -> IO ()
pruner live = do
    present <- listFilesRecursive "output"
    mapM_ removeFile $ map toStandard present \ map toStandard live

main :: IO ()
main = shakeArgsPrune shakeOptions pruner $ do
    ... rules go here ...

这会删除 output 中的所有文件,这些文件不是根据当前的构建系统生成的和最新的。有关完整示例,请参见 http://neilmitchell.blogspot.co.uk/2015/04/cleaning-stale-files-with-shake.html.

shakeArgsPrune功能仅在shake-0.15.1及以上版本可用,但基于shakeLiveFiles功能已可用更长时间,如果您愿意,可以直接使用.