我正在尝试编写一个makefile来资产指纹我的javascript文件。这样我可以有无限的缓存到期。
我有一个名为src /的文件夹。我想在那里获取javascript文件,并将名称替换为app.6b3hj24278b.js
。所以我可以这样做一个目标。
然后我想我可以使用grep将index.html中的app.js实例替换为指纹文件。
这是我的整个makefile
#Variables
APP=application
JS_SRC=src/boot.js
JS_TARGETS =$(patsubst %.js,$(md5sum $JS_SRC),$JS_SRC)
HTMLSRC=index.html
OUTDIR=dist/
.PHONY: all clean
all: html js
js: $(JS_TARGETS)
cp $(js_src)$(date) $(OUTDIR)
html: $(HTMLSRC)
cp $(HTMLSRC) $(OUTDIR)
clean:
rm all
```
特别是我试图让JS_TARGETS
为名称添加md5。我得到的是*** No rule to make target 'S_SRC', needed by 'js'. Stop.
有一种简单的方法吗?奖励积分如果它将通配符文件src / * .js,但如果我必须添加我的文件名也没关系。
如果有一个makefile目标将html目标中的“app.js”实例替换为“app.md5sum.js”,也会很棒。
更新:
对于那些可能感兴趣的人。我制作的makefile就是这个要点
func_num_args()
它扫描index.html并查找脚本引用。指纹它们,并更新index.html以匹配。所以我可以在任何js文件上使用无限缓存到期
答案 0 :(得分:2)
这不是有效的代码。
JS_TARGETS =$(patsubst %.js,$(md5sum $JS_SRC),$JS_SRC)
没有函数md5sum
;你想要$(shell md5sum ...)
;但正如括号所示,它将在patsubst
运行之前进行评估,此时还没有有用的参数。尝试这样的事情。
JS_TARGETS := $(foreach j,$(JS_SRC),$(basename $j).$(word 1,$(shell md5sum $j)).js)
foreach
function仅在循环时评估其最后一个参数,因此您可以获得所需的结果。 word
仅从md5sum
的输出中提取实际校验和,其中包含文件名。
(您还有不完整的包围; $JS_SRC
相当于$(J)S_SRC
,而您需要$(JS_SRC)
; $(patsubst ...)
不会像您认为的那样有效。)
至于解析html
中的引用,我只需从sed
的输出生成md5sum
脚本。这是未经测试的,但您应该很容易找到许多Stack Overflow问题(这是我自己的一些问题);
md5sum $(JS_SRC) \
| sed 's%^\([0-9a-f]\*\) \(.*\)\.js$%s/\2\.js/\2.\1.js/g%' \
| sed -f - -i *.html
简而言之,我们将md5sum
的输出转换为sed
替换命令序列,然后将生成的sed
脚本传递给sed
的第二个实例。与往常一样,sed
并非完全标准化,因此请查阅本地sed
手册页进行调整(特别是,您的方言可能会或可能不会在捕获括号之前使用反斜杠)。另外,如果您的sed
不喜欢使用-f
从标准输入中读取-
的脚本,那么您可能希望使用sed
脚本生成临时文件而是一个Makefile目标。
当你把它放在Makefile中时,美元符号需要通过加倍来转义;这只是为了在shell提示符下进行测试。