我正在尝试为我的HTML5 / PHP项目创建一个Makefile。我有一个像这样的PHP配置文件:
<?php
...
$mode = "development"; # production / development / debug
...
?>
我想从Makefile中强制该值为“production”。 我有一个shell脚本可以工作(至少读取值):
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问题的不同解决方案......
答案 0 :(得分: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等。
我建议至少只在一个地方进行设置。
至于以编程方式更改设置文件,我已经看到成功使用的基本模板(例如,### REPLACEME ###)。您保留父模板文件。并且不同的构建目标生成模板文件的不同版本,并替换适当的变量值。适用于管理dev和prod服务器上的不同配置文件,以及跨开发人员管理不同的配置文件。
答案 1 :(得分:0)
您通常需要PHP文件的预处理器。当您在Makefile中设置一些变量时,比如PRODUCTION
,您的预处理器将放置不同的代码,以便您获得生产代码。
我没有用过,但我遇到了C Compatible Preprocessor for PHP。你可以尝试一下。
使用CCPP的示例代码是:
<?php
#ifdef DEVELOPMENT
$mode = "development"; # production / development / debug
#else
$mode = "production";
?>
答案 2 :(得分:0)
我想出了以下几点。首先,可以简化裸(shell)命令:
perl -ne 'print if s/.*\$mode\s*=\s*"(.*)".*/$1/g' config.php
在Makefile中,我到目前为止唯一可以发现的转义问题是使用$
符号 - make尝试处理这里不起作用的变量。我找到的解决方案是将这些$
符号加倍。 Makefile示例:
test := $(shell echo `perl -ne 'print if s/.*$$mode\s*=\s*"(.*)".*/$$1/g' config.php`)
all:
echo $(test)
用法/输出:
$ make
echo development
development