自2012年3月1日釋出以來,Composer因提供了PHP迫切需要的東西:依賴項管理而廣受歡迎。實際上,Composer是將所有第三方軟體(例如CSS框架,jQuery外掛等)引入你的專案的一種方法。
我敢肯定,現在有很多編碼人員對使用作曲家的好處感到疑惑,並且還有很多人害怕去嘗試新的工具。在本文中,我們將會了解 Composer 它到底是什麼,它做了什麼,為什麼它是一個很棒的 PHP 開發工具。
首先,我們將更深入地瞭解依賴管理,然後安裝 Composer。我們將大致瞭解一下它的基本用法,然後學習一些基礎知識。現在我們開始吧!
什麼是依賴管理?
-
依賴性管理實際上是一個非常簡單的概念。假設您現在需要建立一個單頁的網站,而你的 JavaScript 和 CSS 的需要用到 Foundation 框架。要如何將 Foundation 框架新增到專案中呢?
-
通常的方法是訪問網站,下載軟體包並將其放在專案中的某個位置。到目前為止,一切都很好。現在,當你想更新到最新版本時該怎麼辦?你重複同樣的事情,覆蓋舊版本。
-
假設這種情況持續了一段時間,你發現有些東西壞了。他們改變了Foundation的某些內容,現在你必須回滾,但是要去哪裡呢?你需要找到較舊的版本並開始應用它們,直到找到合適的版本為止。
-
即使你能把這些都解決,那假設你現在開始著手別人的專案了,他們也使用 Foundation 嗎?如果用了,它安裝在哪裡呢,它是什麼版本呢?
-
對於一個小的專案來說,這些看起來並不是什麼大問題,但是請想象一下一個擁有 8-10 個依賴(這仍然不算很多)的專案會怎樣。模組化管理將變得不可能做到,或者至少是浪費時間的。
-
依賴管理通過自動化和標準化來解決這些問題。依賴的檢索,如 Foundation、jQuery、Twig、Symphony、日誌記錄模組等等都可以通過以程式設計方式的方式來完成。還可以指定版本以防止衝突。
-
依賴管理器將包的儲存方式和使用位置標準化。在實際應用中,這意味著每個使用相同依賴管理器的專案都將遵循相同的結構 —— 至少對於那些依賴是這樣。
安裝 Composer
Composer 有各個系統的版本。 在 Windows 系統,你可以通過 Composer Setup 檔案來安裝,安裝包可以在這個頁面 找到。 在基於 Linux 的系統, 包括 OSX,你可以在本地使用以下命令來安裝:
curl -sS https://getcomposer.org/installer | php
在你的專案目錄執行上面的命令,你會得到一個 composer.phar 檔案,該檔案可以用來執行 Composer。 我更喜歡全域性安裝,這樣就可以在任何目錄下執行 Composer 命令。全域性安裝需要執行以下命令::
mv composer.phar /usr/local/bin/composer
執行這個命令可能有兩種情況會產生錯誤。 一個是你沒有管理員許可權,這時你可以在命令前面加 sudo 再執行。
sudo mv composer.phar /usr/local/bin/composer
另一個是,在 Yosemite 上執行, 因為沒有 usr 目錄, 這個命令會報錯,這時只要建立相應的目錄再次執行就好了。
Composer 簡介
使用 Composer 進行依賴管理由兩個獨立的元素組成。第一個是 Composer 本身,它是用於獲取和管理依賴項的命令列工具。第二個是 Packaginst —— 主要的 Composer 庫,它是儲存了你可能想要使用的包的地方。
使用 Composer 時,依賴管理的核心是一個名為 composer.json 的 JSON 檔案。具體內容如下:
{ "name": "danielpataki/my_project", "description": "My New Project", "authors": [ { "name": "Daniel Pataki", "email": "mail@mymail.com" } ], "require": { "monolog/monolog": "1.12.0" } }
你的專案想要引入的依賴將會列在 require 項中。在上述情況中,我引入了 Monolog,它是一個流行的日誌記錄框架。但是我僅有一個包含了這些資訊的 JSON 檔案並不意味著我就可以開始使用 Monolog 了。這時候就需要使用到命令列了。
使用命令列切換到專案資料夾中,然後輸入 composer install 命令。這將把我所有的依賴引入到專案中,並做一些其他讓程式碼整潔的事情。
它建立了一個 vendor 目錄,該目錄容納了包括 Composer 在內的所有依賴項。截圖中還顯示了 Monolog 和 PSR,這是除 composer.lock 檔案外 Monolog 的依賴項。
到此為止,你已經可以開始使用您的依賴項了,但是我們還能做更多的事情來提高效率。讓我們進一步學習 Composer。
指定版本
在上面的程式碼中,我們指定了版本 1.12.0,但在某些情況下,我們可能希望得到更大的版本範圍。有六種可以指定想要的版本的方法,讓我們來看看它們:
版本範圍
使用比較運算子,你可以獲取高於 1.3 並且低於 1.8 的版本,或者使用 AND 和 OR 邏輯獲取更復雜的版本集。使用的運算子可以是 >,<,>=,<= 和 !=。AND 邏輯用空格或逗號表示,OR 邏輯用雙豎線表示:||。
指定 >2.7 表示高於 2.7 的任意版本。>2.7 <=3.5 則表示高於 2.7 並低於 3.5(包括 3.5)的任何版本。
萬用字元版本
通過使用萬用字元,你可以指定版本的模式。例如 2.3.*,它表示包括 2.3.0 及以上並且低於 2.4.0 (不包括 2.4.0)的所有版本。它等價於 >=2.3.0 <2.4。
連字元範圍
使用連字元能讓你更容易地指定版本範圍,但是它對於版本的特殊處理方式容易讓人感到疑惑。一個完整的版本由三個數字組成,在這種情況下連字元範圍是完全合理的。
2.0.0 - 3.0.0 連字元範圍表示所有 2.0.0 以上並且在 3.0.0 以下的版本(包括了 2.0.0 和 3.0.0)都將被接受,等同於 >=2.0.0 <=3.0.0。
但是如果只指定了部分的版本號,如 2.0 - 3.0,意味著任何高於 2.0 的版本(包括 2.0)但低於 3.1 版本。
這種看似奇怪的行為是因為連字元左側是包含的,右側則會使用萬用字元進行補全。上面的表示式等同於 >=2.1 ❤️.1.0
波浪號範圍
~ 運算子可以很好地標記你所依賴的最小次要版本,並允許任何高於此版本內容,但不包括下一個主要版本。如果你指定 ~3.6,那麼你將允許 3.6 及其以上的版本,但不包括 4.0 版本。
~ 運算子最好用示例解釋:~3.6 等價於 >=3.6 <4.0.0,而 ~3.6.3 等價於 >=3.6.3 ❤️.7.0。正如你所看到的,它對於尊重 語義版本控制的專案來說是非常有用的。因為理論上應該沒有向後相容性破壞直到 4.0,它會執行良好。另一種理解方式是使用 ~ 指定一個最小版本,但允許指定的最後一個數字增長。
注意: 雖然 4.0-beta.1 是在 4.0 之前,但版本約束,如 ~3.6 不會安裝它。正如上面所說的 ~3.6 只意味著 .6 可以改變,但 3. 部分是固定的。
注意: ~ 運算子對其主要發行號的行為有例外。這意味著,~1 與 ~1.0 是相同的,因為它不會允許主數字增加以試圖保持向後相容性。
插入符
插入符範圍用於允許所有非中斷更新的情況。如果一個專案遵循語義版本控制,那麼在小版本的更新中不應該破壞主版本的相容性。也就是說,在你指定的該版本及以上的任何內容,不包括下一個主版本都不會破壞相容性。它與 ~ 非常相似,但它更接近語義版本控制。通過指定 ^3.3.5,可以允許 3.3.5 及以上,但不包括 4.0 以上的版本。
注意: 主版本號為零(0.y.z)的軟體處於開發初始階段,一切都可能隨時被改變,這樣的版本被視為不穩定版。為了保證相容,^ 將不會更新到下一個小版本,如 ^0.3.0 等於 >=0.3.0 <0.4.0 而不是 >=0.3.0 <1.0.0。
Dev-Master
鎖
依賴的鎖定是 Composer 最有用的特性之一。我在前面提到過 composer.lock 檔案,這個檔案的作用就是是鎖定所用元件的版本。
鎖定檔案可以確保每個人都使用著相同版本的檔案。僅僅因為應用程式不應該由於元件更新而中斷,並不意味著團隊中所有的成員和生產伺服器都應該執行不同的版本。
當你第一次使用 Composer 獲取依賴項時,它會將確切的版本寫入鎖檔案。如果指定了 2.3.* 版本,並且 2.3.5 是當時最新版本,則會安裝 2.3.5 版本並將其記錄在鎖定檔案中。
假設一個開發人員在 10 天后加入團隊。這時,版本已經更新為 2.3.6。如果他使用正確的命令 (composer install),他將會安裝 2.3.5 版本,因為它已記錄在鎖檔案了。
當然,你依然可以更新依賴項。在這種情況下,你應該執行 composer update 命令。這將獲取允許的最新版本並將其寫入鎖檔案。然後將它分發給其他人,讓他們更新版本。
開發依賴
Composer 允許你指定開發依賴。這是通過在 require-dev 陣列中指定你的依賴而不是 require 陣列來完成的。
{ "name": "danielpataki/my_project", "description": "My New Project", "authors": [ { "name": "Daniel Pataki", "email": "mail@mymail.com" } ], "require": { "monolog/monolog": "1.12.0" }, "require-dev" : { "fzaninotto/faker", "dev-master" } }
Faker 是一個生成假資料的 PHP 類。這對開發很有用但對生產來說並不需要。
請注意,預設情況下始終會安裝開發依賴,Composer 不會神奇地知道它何時在生產伺服器上執行。如果要排除開發依賴,則需要執行 install 或者 update 命令時加上 --no-dev 選項
Composer 現狀
Composer 在 PHP 開發中隨處可見。 幾乎所有大型和知名的網站元件,如 jQuery,Foundation,Bootstrap,甚至 WordPress 都有一個 Composer 包。
此外,較小但同樣好用的程式碼包也可以通過 Composer 檢索到。 如 Monolog 這樣的日誌記錄包,PHP 郵件管理包,字串操作類,PHP 單元和其他工具等等。
框架社群從 Composer 統一專案需求的能力中獲益匪淺。 備受青睞的 Laravel,FuelPHP,Yii Framework 等框架都依靠 Composer 將功能整合並共享給其他專案。
當然最大的好處是不易察覺的。當你需要共享或部署程式碼時,Composer 非常好用。你不需要把大約 20-50MB 的相關但未使用的程式碼拖來拖去。你只需將它們寫入 composer.json 和 lock 檔案中,所有人都能在幾分鐘內得到同樣的頁面了。
結論
我希望我已經讓你對 Composer 強大的功能有所瞭解,但其實你還能使用它來做更多的事情。除了我們討論的內容之外,Composer 還為你提供了出色的自動載入功能,你可以將指令碼掛接到更新過程的任何步驟等等。
任何小組專案都應該使用 Composer,但即使你單獨工作,它還是非常實用的。它給你提供了很大的靈活性,並且給你的專案提供了不會過時的技術 ——你永遠不知道什麼時候你可能需要額外的幫助!
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,進階PHP月薪30k>>>架構師成長路線【視訊、面試文件免費獲取】