使用md5的Makefile目标

时间:2016-04-05 04:10:00

标签: makefile

我正在尝试编写一个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文件上使用无限缓存到期

1 个答案:

答案 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提示符下进行测试。