8

Makefile に次のものが含まれている Web アプリで作業しています。

dist/index.html: src/templates/index.html
    @bin/insert-scripts $< --output $@

bin/insert-scripts<--scripts-->は、提供されたファイルを次のいずれかに置き換えます。

  • $ENV が「development」の場合は、多数のスクリプト タグ (jQuery、Underscore など)、または
  • $ENV が "production" の場合、単一のスクリプト タグ (連結された縮小ファイルを指す)。

問題は、あるモード (「開発」など) で dist/index.html をビルドし、依存関係に触れずに別のモードで再度ビルドすると、make は何もする必要がないと言うことです。私ができるようにしたいのは、$ENV を dist/index.html の依存関係にすることです。

dist/index.html: src/templates/index.html $ENV
    @bin/insert-scripts $< --output $@

もちろん、これはうまくいかないので、「開発」または「生産」のいずれかを含む ENV という名前のファイルを用意することを検討しました。このファイルは依存関係になります。

dist/index.html: src/templates/index.html ENV
    @bin/insert-scripts $< --output $@

環境変数を設定するのではなく、ENV ファイルの内容を設定します。これは少し不格好に思えますが、少なくとも依存関係ツリーを正確に表しています。

この状況を処理する最善の方法は何ですか?

4

3 に答える 3

6

変更された環境の再構築を強制する必要がある場合は、いつでもビルド環境にタグ ファイルを使用できます。

.PHONY: always-rebuild

environment : always-rebuild
   echo $ENV > $@.tmp
   diff --quiet $@ $@.tmp || cp $@.tmp $@
   rm -f $@.tmp

dist/index.html : src/templates/index.html environment

diffing は、常に再構築 (<= チェック) されることを保証しますenvironmentが、関連する環境変数が変更された場合にのみ変更されます。

于 2013-02-12T21:35:06.627 に答える
5

したがって、make次の 2 つのケースでスクリプトを実行する必要があります。

  • src/templates/index.htmlかわった
  • ENV環境変数は、最後に生成してから変更されましたdist/index.html

この要件の問題は、環境変数にタイムスタンプがないことです。したがって、make はターゲットが最新かどうかを知ることができません。

dist-development/index.html通常、同様の状況での解決策は、となどの個別のターゲットを単純に持つことdist-production/index.htmlです。シンボリック リンクなどを使用して、Web アプリを正しい最新バージョンのindex.htmlに効率的にポイントする方法を見つけることもできます。しかし、 ENVファイルを使用する代替手段も可能です。手順を少し改良することをお勧めします。

.PHONY: ENV
ifneq "$(ENV)" "$(shell cat ENV)"
dist/index.html: ENV src/templates/index.html
    @bin/insert-scripts $< --output $@
else
dist/index.html: src/templates/index.html
    @bin/insert-scripts $< --output $@
endif

ENV:
    echo $(ENV) >$@

このようにして、make は$ENVの現在の設定を受け入れ、正しいタイムスタンプでファイルに保持します。

于 2013-02-12T21:35:17.170 に答える
2

すべての関連情報がファイル名にエンコードされている場合、Makeは常に最適に機能します。

all : dist-${ENV}/index.html

dist-development/index.html : src/templates/index.html
    ENV=development bin/insert-scripts $< --output $@

dist-production/index.html : src/templates/index.html
    ENV=production bin/insert-scripts $< --output $@
于 2013-02-12T21:33:02.020 に答える