2

HTML5/PHPプロジェクトのMakefileを作成しようとしています。私はこのようなPHP設定ファイルを持っています:

<?php
    ...
    $mode = "development"; # production / development / debug
    ...
?>

その値をMakefileから「本番」に強制したいと思います。私は(少なくとも値を読み取るために)機能するシェルスクリプトを持っています:

echo `perl -ne 'print if s/.*\\\$mode\s*=\s*"(.*)".*/$1/g' config.php`

しかし、それはMakefileにはありません:

MODE = $(shell echo `perl -ne 'print if s/.*\\\$mode\s*=\s*"(.*)".*/\$1/g' config.php`)

($(MODE)は常に空です...)外部スクリプトを使用できることはわかっていますが、使用したくないです。

おそらく私のアプローチは最も正しくありません。そのようなMakefile/PHPの問題に対するさまざまな解決策について聞いてみたいです...

4

3 に答える 3

1

PHPは、おそらくPHP構成ファイルを解析するための最も簡単で堅牢な言語です。

MODE = $(shell make -s get-php-var-mode)

get-php-var-%:
        php -r 'require("config.php"); print_r("$$$*\n");'

print-MODE:
        @echo ${MODE}

これは、Makeを読み取るためのものです。

また、JSON、XMLなど、両方の言語で簡単に解析できる、より標準的な形式で単一の設定ファイルを保持することもできます。

少なくとも、設定は1か所だけにすることをお勧めします。

プログラムで設定ファイルを変更する限り、基本的なテンプレート(### REPLACEME ###など)が成功して使用されているのを見てきました。親テンプレートファイルを保持します。また、ビルドターゲットが異なれば、適切な変数値が置き換えられた、異なるバージョンのテンプレートファイルが生成されます。devサーバーとprodサーバー間で異なる構成ファイルを管理するため、および開発者間で異なる構成ファイルを管理するために機能します。

于 2012-12-17T07:32:14.693 に答える
0

私は次のことを理解しました。まず、ベア (シェル) コマンドを単純化できます。

perl -ne 'print if s/.*\$mode\s*=\s*"(.*)".*/$1/g' config.php

Makefile 内でこれまでに見つけた唯一のエスケープの問題は、$記号に関するものでした。make はここで変数を処理しようとしますが、これは機能しません。私が見つけた解決策は、これらの$兆候を2倍にすることでした. メイクファイルの例:

test := $(shell echo `perl -ne 'print if s/.*$$mode\s*=\s*"(.*)".*/$$1/g' config.php`)

all:
    echo $(test)

使用法/出力:

$ make
echo development
development
于 2012-12-18T01:57:57.807 に答える
0

通常、PHP ファイルのプリプロセッサが必要になるもの。たとえば、Makefile に変数を設定するとPRODUCTION、プリプロセッサは別のコードを配置して、製品コードを取得します。

私は使用していませんが、 C Compatible Preprocessor for PHPに出くわしました。試してみてください。

CCPP を使用したコード例は次のようになります。

<?php
    #ifdef DEVELOPMENT
    $mode = "development"; # production / development / debug
    #else
    $mode = "production";

?>
于 2012-12-16T11:44:34.567 に答える