基于 Composer 的 PHP 模塊化開發(fā)
這個話題之前是在微博公司內(nèi)部做的技術分享怜奖,這里拿出來分享給大家。
基于 GitHub 或者其它平臺托管的開源項目的引入大家應該都已經(jīng)非常熟悉了抑月,但是公司內(nèi)部項目的模塊化應該怎么做呢?這或許是不少朋友頭疼的問題。
我們先聊聊 PHP 模塊化開發(fā)演進的過程,在沒有 GitHub 之前幢哨,我們大家獲取與分享代碼的方式主要是博客,國內(nèi)的 CSDN 或者博客園還有很多很多嫂便,大家都是從文章內(nèi)復制到自己項目里面使用±塘現(xiàn)在看起來真的是相當原始粗暴,但是那個時代也沒有太多可選的方案顽悼。導致的現(xiàn)象就是一段代碼在 N 個項目里出現(xiàn)曼振,可能見得最多的就是獲取客戶端 IP 的那幾行了几迄,在互聯(lián)網(wǎng)上不止出現(xiàn)了幾萬遍∥盗現(xiàn)在很多項目里都還是這段:
是不是很熟悉?
這種引入代碼的方式有很多弊端:比如不安全映胁,因為很多人是直接復制粘貼就用上了木羹,根本沒花時間去考證它是否真的是安全的。另外一個問題就是不同步解孙,你今天在別人那里復制過來就用上了坑填,后來作者發(fā)現(xiàn)了 bug 并修復更新了文章也不會通知你,你也不可能記得這段代碼來自哪里去檢查更新弛姜。
在沒有 Composer 之前我們是如何引入代碼的呢脐瑰?除了上面說的復制粘貼以外,在 PHP 中還有 pear廷臼,不過自從用過兩次我就再也不用它了苍在,一種說不出來的感覺绝页。
不信你可以找一些舊的項目看看,在沒有 Composer 之前的項目中寂恬,你會發(fā)現(xiàn)大量的重復代碼续誉,以及各種花樣的組織格式,各種規(guī)范的寫法初肉。這也是 Composer 誕生的原因之一酷鸦。
Composer 給我們帶來了諸多的好處:
模塊化,降低代碼重用成本
統(tǒng)一的第三方代碼組織方式
更科學的版本更新
這三個是比較重要的特征了牙咏,基于 GitHub 的共享代碼方式解決了傳統(tǒng)引入方式帶來了各種問題臼隔。
我們先來了解一點 Composer 基礎。
Composer 的實現(xiàn)結構相對比較簡單妄壶,Packagist.org 是 Composer 官方數(shù)據(jù)源躬翁,它的數(shù)據(jù)基于 GitHub 等代碼托管平臺,你在本地使用 Composer 命令行工具盯拱,基于 Packagist.org 的數(shù)據(jù)信息安裝與更新依賴盒发。 本地安裝 Composer 非常簡單,主要有以下幾種方式:
新手同學需要注意的是狡逢,這里一定要確定 composer 安裝目錄在環(huán)境變量 $PATH 內(nèi)才能全局使用 composer 命令宁舰。
那接下來我們聊一下如何創(chuàng)建一個 Composer 包。
步驟很簡單奢浑,創(chuàng)建目錄蛮艰,然后在目錄內(nèi)使用命令 composer init 按照提示完成包的初始化。
接著就是完成你的代碼編寫雀彼,然后在 composer.json 文件配置你的引入方式等信息壤蚜。 然后我們?nèi)绾螌σ呀?jīng)寫好的代碼進行測試呢?
我們需要在其它任何地方建立一個測試項目(不要在剛才創(chuàng)建的包目錄就可以)徊哑,比如這里我們創(chuàng)建一個叫 'my-package-test' 的目錄袜刷,然后在目錄里 composer init 完成項目初始化。接著就是聲明項目依賴莺丑,我們這里要依賴的就是剛才建立好的包著蟹,由于我們的包還沒有發(fā)布到 packagist,所以是無法直接 composer require 來安裝的梢莽,我們需要告訴 composer 從哪里加載我們的包信息:
$ composer config repositories.foo path /Users/overtrue/www/foo/bar
我們通過這個命令在 composer.json 中 repositories 區(qū)塊添加了一個項目源萧豆。
然后我們添加包依賴:
$ composer require foo/bar:dev-master -vvv
這樣就完成了包的安裝,你會發(fā)現(xiàn)這樣的安裝方式它只是創(chuàng)建了一個軟鏈接到包目錄昏名,所以涮雷,你在測試的時候就可以直接在 vendor/foo/bar 下修改代碼,這樣就加快了你的開發(fā)速度轻局。
這里在原作者的基礎上洪鸭,補充個總結:
在windows或者mac開發(fā)環(huán)境中膜钓,通過
composer require……
的方式引入本地開發(fā)包,只是創(chuàng)建了一個軟鏈接到包目錄卿嘲。
但是經(jīng)過測試颂斜,在linux服務器環(huán)境中,并不是創(chuàng)建軟鏈接拾枣,而是直接復制一個副本到項目目錄沃疮。
因此,對于在windows或者mac的IDE寫代碼梅肤,并通過IDE自動上傳代碼到linux服務器的同學司蔬,要特別注意這一點,你在IDE中修改的是軟件包的源代碼姨蝴,但是軟鏈接的文件并沒有動過俊啼,所以,不會自動提交到linux服務器中左医。這里提供兩種簡單方式授帕,二選一即可
1、手動把軟連接文件提交到linux服務器中
2浮梢、在linux服務器中使用composer remove foo/bar
跛十,然后再使用composer require foo/bar:dev-master
,重新引入軟件包
其實以上兩種方式秕硝,都可以簡單理解成把更新的軟件包代碼復制到了項目中了芥映。
更多細節(jié)這里你就自己去研究了,我們來看看 composer.json 文件:
我們最需要關心的就是圖里上面的三個部分了远豺,包名奈偏、依賴、以及自動加載躯护,是必不可少的部分惊来。
剛才我們提到了包的安裝,安裝依賴包的方式主要有以下兩種:
手動方式是不太推薦的榛做,容易寫錯唁盏,比如后面多一個逗號之類的内狸,不過你可以寫完以后使用以下命令來驗證:
$ composer validate
更新依賴就非常簡單了:
雖然在上一篇文章我們已經(jīng)講了語言化版本检眯,這里再提一次:
我們在依賴一個包的時候,很多同學對于依賴的版本一直處于蒙逼狀態(tài)昆淡,那看完下一頁你就恍然大悟了锰瘸,首先是兩個符號:"~" 與 "^"
接著是版本號的范圍的各種寫法:
還有包含穩(wěn)定性的標識:
這里需要說一下生產(chǎn)環(huán)境最重要也一直是好多同學不清楚的一個東西:版本鎖定,很多人在糾結昂灵,要不要把 composer.lock 上傳到代碼庫啊避凝。我可以給你一個特別簡單的判斷方法:
如果你的代碼是一個項目舞萄,就上傳,如果是一個工具包管削,給大家用的倒脓,就別上傳。
在已經(jīng)存在 composer.lock 的目錄執(zhí)行 composer install 的時候含思,是不會分析包依賴的崎弃,它只是按 composer.lock 中描述的下載地址直接下載,所以會快很多含潘,而且版本號是具體的饲做。那怕包已經(jīng)發(fā)了新版,只要 composer.lock 沒動過遏弱,它就會按 composer.lock 里的版本來安裝盆均。composer update 時會更新 composer.lock,所以不要亂用 composer update漱逸。
包開發(fā)好了怎么發(fā)布泪姨?開源的方式是這樣的:
最后一句請酌情考慮。
另外一種發(fā)布方式是閉源饰抒,公司內(nèi)部用的包驴娃,上傳到 GitLab 或者其它私有的代碼托管平臺,有兩種玩法:
最容易的玩法循集,在 composer.json 中添加 repositories 直接用 vcs 指定代碼庫地址
這樣做有一個缺點唇敞,當你的包很多的時候,你全都得在 composer.json 中加上才行咒彤。
自已架設 Packagist 類似的服務疆柔,Packagist 官方提供了兩款: Toran,收費镶柱,開源方案是 Satis旷档,不過它偏手動一些,自己酌情選擇即可歇拆。
私有包有一個點需要注意:授權鞋屈,私有包肯定都是需要授權才能訪問的,這里由于方案不太通用故觅,大家根據(jù)自己的場景來解決就好了厂庇。
另外,有一些痛點不曉得啥時候能夠解決:
好在 Laravel China 已經(jīng)為了我提供了國內(nèi)目前最穩(wěn)定最好用的鏡像源输吏,Composer 中文鏡像 / Packagist 中國全量鏡像正式發(fā)布权旷!
最后總結一下:
微信并不適合聊一些代碼細節(jié)的東西,我更多的傾向于提供思路贯溅。
在 PHP 現(xiàn)代開發(fā)中拄氯,Composer 已經(jīng)是離不開的東西了躲查,它的確加快了我們的開發(fā)速度節(jié)省了開發(fā)成本,如果你還在糾結用不用 Composer译柏,那你真得反思一下了镣煮。
本文標題是模塊化開發(fā),內(nèi)容主要介紹了包的創(chuàng)建與測試鄙麦,以及公有包與私有包的發(fā)布方案怎静。但是無法幫你解決,如何拆分項目這類問題黔衡,這得基于你的長期經(jīng)驗積累蚓聘,但是有一些經(jīng)驗可以分享一下:
1、不要過度設計盟劫,很多自以為很 NB 我不把學到的東西用上就是不爽的同學夜牡,上來就分庫分表,uuid 做主鍵之類侣签,項目運營了好幾年一個表還沒到 100 萬條記錄塘装,也是夠厲害的。
2影所、不要過早設計蹦肴,真正 NB 的架構是演進而來的,不是前期設計出來的猴娩,當然不是說完全不需要設計哈阴幌,恰當?shù)母鶕?jù)實際情況來就好,不要立項就把 “千萬”卷中、“億級”矛双、“百億” 這些單位掛在嘴邊,也許到你項目倒閉那天你都沒到過任何一個量級蟆豫。隨著項目逐漸改進即可议忽。
3、優(yōu)先關注成本十减,很多同學以為是性能栈幸,No! 技術團隊真正的成本是人力,所以開發(fā)效率才是優(yōu)先需要關注的帮辟。上次文章在發(fā)在知乎有人就強制把我的 “不要首先關注性能” 解讀成了 “性能不重要”速址,也是夠厲害的,語文也許跟養(yǎng)殖場動物學的织阅。數(shù)學正常一點的人都會算壳繁,一臺服務器多少錢?一個技術員工多少錢荔棉?服務器你花 20 萬是永久資產(chǎn)闹炉,一個員工 20 萬呢?半年工資润樱?一年工資渣触?
————————————————
原文作者:overtrue
轉(zhuǎn)自鏈接:https://learnku.com/articles/5333/modular-development-of-php-based-on-composer
版權聲明:著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權壹若,非商業(yè)轉(zhuǎn)載請保留以上作者信息和原文鏈接嗅钻。