2017-08-08 46 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