【问题标题】:Lite and full version of the same PHP component同一 PHP 组件的精简版和完整版
【发布时间】:2015-04-07 12:02:03
【问题描述】:

我想为同一个 PHP 组件创建一个精简版和完整版。当然,我希望它们共享一个共同的代码库——所以如果我发现了一个错误,或者添加了一个特性,我只需要在一个地方更新它。

在编译语言中,更好的方法是只有一个项目,有多个目标——每个版本一个。在这种情况下,我会使用预处理器宏来识别代码中的产品版本,从而根据版本启用逻辑决策。

使用 PHP 解决这个问题的最佳方法是什么?当然,完整版的具体代码不要出现在精简版的PHP文件中,否则精明的开发者可能会轻松解锁功能。

【问题讨论】:

  • 你需要有一个用于 lite 组件的公共代码库吗?
  • 如果您可以将您的功能清晰地分离到不同的文件中,例如通过插件系统或类继承,您可以使用任何您想要生成最终“二进制”的构建系统,其中包含所有文件或仅包含文件的子集。
  • 您所需要的只是一种自动方法,可以从您描述的完整源中创建两个“目标”。我的建议是使用 [Grunt][1]。 PHP 有很多包,我相信你可以使用它们构建你想要的东西。例如: - PHP CodeSniffer (npmjs.org/package/grunt-phpcs) - PHP linting (npmjs.org/package/grunt-phplint) - PHPUnit (npmjs.org/package/grunt-phpunit) - PHP Analyzer (npmjs.org/package/grunt-php-analyzer) - PHP 的内置网络服务器 (npmjs.org/package/grunt-php) [1]: @ 987654326@
  • @ÁlvaroG.Vicario:不,代码托管在我的私人修订控制服务器上
  • @deceze:对于这种情况,您建议使用哪种构建系统?

标签: php preprocessor


【解决方案1】:

最好的方法是使用 OOP。

例如,创建类的基本版本:

class BasicComponent
{
    ... add basic functionality here
}

创建类的扩展版本:

class FancyComponent extends BasicComponent
{
    ... add fancy stuff here
}

要么只部署基本版,要么也部署高级版。


还有很多其他方法可以为此目的使用 OOP。我可以想到一个可以实例化很多特性的工厂,其中每个特性都是一个类,而您只使用组件的基本版本部署其中的几个。

【讨论】:

  • 很好,但它只解决了部分问题。一旦为完整版和精简版创建了子类,我必须手动创建一个脚本来部署一个或另一个?在我看来,不舒服和笨拙。没有更好的(自动化)解决方案吗?
  • 我会把基础组件放到一个单独的 git repo 中,并使用 composer 甚至 git submodule 将基础版本包含到花哨的开发树中。然后,您将自己构建每一个并单独部署它们,其中花哨的依赖于基本的。
【解决方案2】:

this similar question找到的基础上,我终于这样解决了:

1.我安装了Phing,一个基于Apache Ant的PHP项目构建系统或构建工具。

2.我创建了一个build.xml 文件,其中包含了这个目标:

<target name="preprocess" depends="prepare">
    <foreach param="fname" absparam="abs-fname" target="preprocessfile">
        <fileset dir="${build.dir}">
            <patternset>
                <include name="**/*.php"/>
            </patternset>
        </fileset>
    </foreach>
</target>

<target name="preprocessfile">
    <exec command="gcc -E -x c -P -C -D PREMIUM ${abs-fname} -Wno-invalid-pp-token -o ${abs-fname}" 
        escape="false"
        checkreturn="true"
        passthru="true" />
</target>

在实践中,我在每个 PHP 文件上启动 GCC 预处理器,并利用它来完成我需要的工作。效果很好!

不仅:通过 Phing,我创建了一些目标来进行 PHP 验证、JavaScript 缩小、创建要部署的存档等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多