haskell – Shake:当文件名不为a-priori时,如何继续

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

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

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

"index.html" %> \out -> do
  need [ "app-<hash>.min.js" ]
  ...

我尝试过使用虚假的行动

"index.html" %> \out -> do
  need [ "revJsAndCssFiles" ]
  ...

phony "revJsAndCssFiles" $do
  ... -- Hash and copy files to appropriate locations

这有效但看起来很难看,因为不应该采取假动作
生成一个文件.

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

最佳答案 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 ++ ">"

这里有一个不断命名的规则(哈希js.txt),这两者产生你想要的文件(地点不明),而该文件的名称(以固定位置).这样,当您需要index.html中的文件时,您都依赖它并获得生成的文件名,这可能是必需的.

如果你不需要index.html中的文件名,那么这个技巧同样有效 – 然后你只丢掉文件的内容 – 但感觉有点丑陋.

点赞