摇:当文件名不为先验时,如何继续

时间:2016-04-12 14:43:28

标签: haskell shake-build-system

我正在尝试设置Shake来构建Web应用程序。在构建过程结束时,我想根据内容哈希重命名生成的.js.css文件(用于缓存目的)。

这当然意味着我不知道文件的最终名称看起来像app-<hash>.min.js

由于构建最终index.html的规则需要知道 关于名字,我需要像

这样的东西
"index.html" %> \out -> do
  need [ "app-<hash>.min.js" ]
  ...

我尝试使用{/ 1}}行动

phony

这可行,但似乎很难看,因为"index.html" %> \out -> do need [ "revJsAndCssFiles" ] ... phony "revJsAndCssFiles" $ do ... -- Hash and copy files to appropriate locations 动作不应该 生成一个文件。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

index.html是否需要引用散列的Javascript文件?如果是这样,一种方法是:

"hash-js.txt" %> \out -> do
    src <- readFile' "app.min.js"
    let file = "app-" ++ show (hash src) ++ ".min.js"
    writeFile' file src
    writeFile' out file

"index.html" %> \out ->
    js <- readFile' "hash-js.txt"
    writeFile' out $ "<script src='" ++ js ++ ">"

这里有一个经常命名的规则(hash-js.txt),它既可以生成您想要的文件(在未知位置),也可以生成该文件的名称(到固定位置)。这样,当您需要来自index.html的文件时,您都依赖它并获得生成的文件名,这可能是必需的。

如果您不需要index.html中的文件名,这个技巧同样有效 - 那么您只需丢弃文件的内容 - 但感觉有点丑陋。