2017-08-08 265 views
2

如何使用两种不同配置构建一组源文件,而无需重新构建所有内容?并行处理多个构建配置

我当前的设置添加了一个选项--config = rel,它将加载build_rel.cfg中的所有选项并将所有选项编译到目录build_rel /。

data Flags = FlagCfg String                                 
    deriving (Show, Eq)                                  

flags = [Option ['c'] ["config"]                               
       (ReqArg (\x -> Right $ FlagCfg x) "CFG")                         
       "Specify which configuration to use for the build"]                                    

main :: IO()                                    
main = shakeArgsWith shakeOptions { shakeChange=ChangeModtimeAndDigest }                     
        flags $                                
        \flags targets -> return $ Just $do                         

    let buildDir = "build" ++                                
        foldr (\a def -> case (a, def) of 
           (FlagCfg cfg, "") -> '_':cfg 
           otherwise   -> def)                      
        "" flags                                

    -- Settings are read from a config file.                            
    usingConfigFile $ buildDir ++ ".cfg" 
    ... 

如果我再运行

build --config=rel 
build --config=dev 

我将结束与两个版本

build_rel/ 
build_dev/ 

但是,每次我切换配置的时候我结束了重建一切。我猜这是因为我所有的神谕都“改变了”。我希望所有的ORACLE都针对我的两个不同的构建目录,以便更改不会影响使用不同配置的构建。

我知道有一个-m选项来指定数据库应该存储在哪里,但我宁愿不必指定两个必须同步所有时间的选项。

build --config=rel -m build_rel 

有没有办法在解析--config选项后更新选项shakeFiles?

另一个想法是参数化我所有的Oracle以包括我的构建配置,但后来我注意到usingConfigFile使用Oracle,我也必须重新实现。看起来笨重。

有没有其他的方式来建立多个目标而无需重建所有东西?这似乎是一件微不足道的事情,但我依然无法弄清楚。如果你想在两个目录是完全无关的,与他们无关之间共享,然后改变数据库以及最有意义

单独的数据库

回答

1

有几个解决方案。目前没有“好”的方法来做这件事(通过两个标志,或者预先解析一些命令行)。然而,它应该是很容易的添加:

shakeArgsOptionsWith 
    :: ShakeOptions 
    -> [OptDescr (Either String a)] 
    -> (ShakeOptions -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules()))) 
    -> IO() 

那么这将让你从一个单一的标志同时控制设置。

单个数据库

如果你想有一个单一的数据库,你可以加载所有的配置文件,并指定像release.destination = ...debug.destination = ...配置,那么规则*/output.txt将查找基于规则的前缀配置,例如release/output.txt将查找release.destination。这样做的好处是任何在调试和发布(例如文档)之间不会改变的东西都可能被共享。

+0

我提出了第一个问题的票在https://github.com/ndmitchell/shake/issues/535 –

+1

目前我去了单独的数据库。 – nesqi