2015-04-07 40 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

相關問題