2016-04-05 11 views
0

私は、私のjavascriptファイルの資産指紋を作成するメイクファイルを作成しようとしています。そうすれば、私は無限のキャッシュの有効期限を持つことができます。Makefile target with md5

私にはsrc /というフォルダがあります。私は、そこにjavascriptファイルを取得し、app.6b3hj24278b.jsに名前を置きたいです。だから私はそのような目標を持つことができます。

次に、index.html内のapp.jsのインスタンスをgrepを使用してフィンガープリントされたファイルに置き換えることができると考えていました。

ここに私の全体のメイクは、特に私はJS_TARGETSが名前にMD5を追加作成しようとしていた

#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 

`` `

です。私が得ているものは*** No rule to make target 'S_SRC', needed by 'js'. Stop.

これを行う簡単な方法はありますか?ボーナスは、もしそれがワイルドカードファイルsrc/*。jsを指しているのですが、私は自分のファイル名にも大丈夫です。

また、 "app.js"のインスタンスをhtmlターゲットの "app.md5sum.js"に置き換えるmakefileターゲットがあった場合は、素晴らしいことでしょう。

更新日:

私が作ったメイクファイルはこの要点です https://gist.github.com/btrepp/164b0153aa9f8d7e258765af7f1c12fc

それはindex.htmlをスキャンし、スクリプトの参照を見つけます。それらを指紋採取し、一致させるためにindex.htmlを更新する。だから私は任意のjsファイルに無限のキャッシュの有効期限を使用することができます

答えて

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)をしたいのに対し、$JS_SRC$(J)S_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 

簡単に言えば、我々はその後、sed置換コマンドのシーケンスにsedの2番目のインスタンスにsedスクリプトを生成し、パスをmd5sumからの出力を変換します。いつものように、sedは完全に標準化されていませんので、ローカルのsedマニュアルページを参考にして調整してください(特に、あなたの方言はキャプチャカッコの前にバックスラッシュが必要な場合があります)。また、sed-fのスクリプトを標準入力から-で読み込むのが気に入らない場合は、代わりにsedスクリプトを使用してテンポラリファイルをMakefileターゲットとして生成することをお勧めします。

ドル記号は、これをMakefileに入れるときに倍にしてエスケープする必要があります。これはシェルプロンプトでテストするためのものです。

+0

それは素晴らしいです。ファイルをコピーするにはどうすればいいですか?私は '$(OUTDIR)/%.js:$(SRCDIR)/%.*。js cp ... etc'のようなものを書こうとしましたが、問題があります。依存関係のmd5ですが、暗黙の照合には私はそれを知っている必要があります。 –

+0

間接的な変数を使って連想配列をハックアップすることも、依存関係のハードコードされたリストを生成することもできます。基本的には、ソースからの(MD5チェックサム付きの)ターゲットからのマッピングを持つMakefileスニペットを作成し、それを 'include 'します。 – tripleee

+0

依存リストに$(basename $(basename%))。extを使うことができました。 2番目の最後の拡張子(md5sum)のこのストリップ –