2016-03-11 33 views
3

有時候,創建目錄mkdir不是正確的工具。它可能是git clonersyncmount。所以,當我們有這樣一條規則:哈斯克爾搖:建設目錄的特殊規則

needDir dirs = filterM ((fmap not) . doesDirectoryExist) dirs >>= need 

rules = do { 
    "project" </> "tool" %> \out -> do { 
    needDir [takeDirectory out]; 
    cmd "make -C" [takeDirectory out]; 
    } 

    "project" %> \out -> cmd "git clone a.url.to/repo.git" [out] 
    } 

正如人們所預料的"project" </> "tool"別的之前創建的目錄projectgit clone甚至沒有運行。有沒有辦法解決這個問題?

我懷疑在這裏有一個新的Rule,但我的文檔很少,而且代碼太混亂了,我無法想出一個可行的解決方案。

+0

此問題也在https://github.com/ndmitchell/shake/issues/430上討論(並且結論將被複製爲答案)。 –

回答

1

將目錄看作是文件的容器。它們存在或不隨機,但如果它們有文件,它們必須存在。特別是,您不能依賴具有need的目錄或編寫規則來創建目錄。根據需要創建目錄 - 如果需要,project/tool.txt的規則將創建project目錄。

如果要取決於正在執行的git clone,請改爲依賴於特定的簽出文件(例如README.md),並創建該文件的規則爲git clone。如果您想確保運行make,請參閱make生成的文件。

可以定義目錄感知規則,請參閱this discussion,但有很多警告,因此它不是推薦的方法或默認支持。