1

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

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

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
4

1 回答 1

0

使用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已经存在更长时间的功能,如果您愿意,可以直接使用。

于 2015-04-25T14:26:10.130 回答