预处理PHP以从构建的文件中删除功能

Mar*_*ler 6 php ant phing build

我一直在阅读有关Phing和Ant的内容,我不确定这些工具对这种情况最有用.

它可以很容易地调试语句等,但我会给你我们的文字scanario.

我们有一个可下载的PHP应用程序的免费和高级版本,而不是只包含隐藏在某处的变量然后执行:

if($premium == true) {
   echo 'some additional functionality';
} else {
    echo 'basic functionality';
}
Run Code Online (Sandbox Code Playgroud)

显然,有人可以接受源并更改该变量,然后爆炸 - 他们窃取了我们的代码.像Ioncube之类的东西在我的经验中完全不实用,对托管公司的支持还不够好.

我更喜欢某些东西..或许类似于此:

## if premium ##
echo 'some additional functionality';
## else ##
echo 'basic functionality';
## endif ##
Run Code Online (Sandbox Code Playgroud)

然后我会运行两个构建,一个将premium设置为true,一个设置为false,这将生成两个简单的文件:

echo 'some additional functionality';
Run Code Online (Sandbox Code Playgroud)

echo 'basic functionality';
Run Code Online (Sandbox Code Playgroud)

能够仅基于传递给构建应用程序的相同条件包含整个文件也是非常有帮助的.

我找不到办法做到这一点,但如果可能,我愿意接受任何其他想法.

帮助很棒,

UPDATE

使用C预处理器非常棒,看起来它可以完成我需要的一切.但是,我找不到如何做以下3件事.

#1我需要删除生成的输出文件中的注释.以下是这些例子.

# 1 "./index.php"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "./index.php"
Run Code Online (Sandbox Code Playgroud)

我没有在您链接到的手册页中找到如何执行此操作的示例.

#2我需要递归遍历每个发现的文件.当我运行当前代码时,我收到一个错误:../target/./folder/test.php: No such file or directory

所以基本上我有我的'source'文件夹,它包含一个名为'folder'的子文件夹,它不会重新创建它,也不会重新创建它(test.php)

#3我确信这个很容易 - 我怎么能让它来处理.js文件,也可能是.html也是为了安全起见?在一个电话中,我的意思是.我假设在.jpg等等文件上运行它是一个坏主意..

再次感谢!

Nic*_*son 0

它的技术含量很低,但当然有 C 预处理器可以完全满足您的需求;只需敲入几个 makefile 来用findor调用它grep -R,您就会得到一个简单、易于理解的解决方案,其语法您可能知道。

更多详情

您可能gcc已经在任何 *nix 主机上安装了。否则,它将是一个标准包。一些发行版单独提供它gcc(如 Debian 的 cpp 包)。

该程序有一些简单的指令;维基页面是一个好的开始,并且手册中的详细信息超出了您的需要。基本上,问题是在每个文件上调用它,并选择-E仅进行宏处理,然后将输出复制到某个构建目录。

您可以编写一个单行脚本来使用 find 来完成此操作,沿着find <proj dir> -type f -name '*.php' -exec cpp -E -D <FULL or RESTRICTED> {} -o <build dir>/{} \;PHP 中的宏 FULL 和 RESTRICTED 的行并引用宏,例如

#ifdef FULL
    <lines for paying customers>
#endif
Run Code Online (Sandbox Code Playgroud)

更新为了使路径正常工作,请尝试以下操作:

#!/bin/bash
cd /.../phing/source/
find . -type f -name '*.php' -exec cpp -E -D FULL {} -o ../target/{} \;
Run Code Online (Sandbox Code Playgroud)

那么../target/{}应该扩展到../target/./index.php.

更新

添加-P以删除线标记(#1)。添加了一行来复制目录结构(#2)。更改了文件名匹配以在 html 上的 js 上运行 (#3)。

#!/bin/bash
cd /.../phing/source/
find . -type d -exec mkdir -p ../target/{} \;
find . -type f -regex '.*\.(php|html|js)' -exec cpp -E -P -D FULL {} -o ../target/{} \;
Run Code Online (Sandbox Code Playgroud)