2015-04-07 56 views
2

我想创建同一个PHP组件的精简版和完整版本。当然,我希望这两个都共享一个通用的代码库 - 所以如果我发现一个bug或添加一个功能,我只需要在一个地方更新它。精简版和完整版本的相同PHP组件

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

用PHP什么是解决这个问题的最好方法?当然,完整版本的特定代码不会出现在Lite版本的PHP文件中,否则精明的开发人员可能会轻松解锁这些功能。

+0

您是否需要为lite组件提供公共代码库? –

+0

如果您可以干净地将您的功能分成不同的文件,例如通过插件系统或类继承,您可以使用任何要生成包含全部或仅包含文件子集的最终“二进制”的构建系统。 – deceze

+0

您所需要的只是一种自动化的方式,如您所描述的那样从完整源创建两个“目标”。 我的建议是使用[Grunt] [1]。 PHP有很多包,我相信你可以用它们来构建你想要的东西。例如: - PHP CodeSniffer(https://npmjs.org/package/grunt-phpcs) - PHP掉毛 (https://npmjs.org/package/grunt-phplint) - PHPUnit的 (HTTPS: // npmjs。org/package/grunt-phpunit) - PHP分析器 (https://npmjs.org/package/grunt-php-analyzer) - PHP的内置 网络服务器(https://npmjs.org/package/grunt -php) [1]:http://gruntjs.com – gbuzogany

回答

0

在什么我this similar question发现的基础上,我终于解决了这个办法:

我安装Phing,PHP项目构建系统或建立基于Apache Ant工具。

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> 

在实践中,我启动了GCC预处理器在每个PHP文件,我趁它做的正是我需要的。它工作得很好!

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

2

最好的方法是使用OOP。

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

class BasicComponent 
{ 
    ... add basic functionality here 
} 

创建类的扩展版本:

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

部署它只有基本的版本,或花哨的版本太多。


有很多其他的方式来使用OOP的目的。我可以考虑一个可以实例化许多功能的工厂,其中每个功能都是一个类,并且只使用组件的基本版本部署一些功能。

+0

太好了,但它只解决了部分问题。一旦为完整版本和精简版本创建了子类,我就必须手动创建一个脚本来部署其中一个或另一个脚本。在我看来,这是不舒服和笨拙的。没有更好的(自动化)解决方案? – Dev

+1

我会将基础组件放入单独的git仓库中,并使用composer甚至git子模块将基础版本包含到花哨项目的开发树中。然后你会自己构建每一个,并分别部署它们,其中那些花哨的依赖于基本的。 – hek2mgl