2

我正在尝试为我的 HTML5/PHP 项目创建一个 Makefile。我有一个这样的 PHP 配置文件:

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

我想从我的 Makefile 中强制将该值“生产”。我有一个可以工作的 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 问题的不同解决方案...

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 等。

我建议至少在一个地方进行设置。

至于以编程方式更改设置文件,我已经看到成功使用基本模板(例如,###REPLACEME###)。您保留一个父模板文件。并且不同的构建目标生成不同版本的模板文件,并替换了适当的变量值。适用于跨开发和生产服务器管理不同的配置文件,以及跨开发人员管理不同的配置文件。

于 2012-12-17T07:32:14.693 回答
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 回答
0

我想出了以下几点。首先,可以简化裸(shell)命令:

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

在 Makefile 中,到目前为止我能发现的唯一转义问题是$符号 - make 尝试在此处处理不起作用的变量。$我找到的解决方案是将这些标志加倍。生成文件示例:

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 回答