PHP系列 - 6: Composer 與 Autoload.php

更新於 發佈於 閱讀時間約 9 分鐘

相信每位有工作經驗的工程師都對 Composer 這個工具有所耳聞。除了知道要執行 composer install 指令之外,你是否了解它的運作背景與流程?當需要調整依賴版本時,你又該如何進行呢?

簡介

眾所周知,大多數專案在開發過程中會使用一些開源的庫,例如 Predis、GuzzleHttp 等。

這些開源項目會因為舊功能的調整、新功能的開發、程式漏洞的修補等原因而不斷更新。然而,這些更新有時候並不是我們所期望的,甚至可能導致專案功能出現問題,因此過去的做法是將所需的版本內容直接複製到自己的專案中以避免更動。

這樣做會造成兩個依賴管理的問題。一方面,隨著開源項目的日益龐大,將這些項目納入 Git 管理會導致每次 Git 操作都耗費大量時間[註1];另一方面,由於現今的項目往往彼此依賴,因此當我們因為某些原因(例如 PHP 版本升級)需要更新開源項目的版本時,不論是調整或是新增開源項目都必須逐一確認所需的最低版本,這又是一大工程。

在這種情況下,Composer 這個依賴管理工具便成為你不可或缺的助手。

檔案

使用 Composer 進行依賴管理時,專案中會包含 composer.jsoncomposer.lockvendor 資料夾這三個項目。一般來說,當我們執行 git clone 將專案下載下來後,專案內應該只會有 composer.jsoncomposer.lock,而不會有 vendor 資料夾,這是非常正常的,因為 vendor 的內容是透過 Composer 下載所需的套件版本後統一放置的。

composer.json

composer.json 是一個 JSON 格式的檔案,裡面記載了專案所需的依賴項目及其指定的版本號,以及下載依賴時的相關設定。主要包含以下三個區塊:

  • require:紀錄專案運行所必需的依賴項目,當我們執行下載或更新指令時,會確認此區域的內容。
  • require-dev:列出在開發過程中所需的額外依賴項目,例如 debug 用的依賴套件。這些套件只有在執行指令時額外加入 -dev 參數時才會被確認。
  • config:記錄下載依賴時的設定,例如限制超時時間等。

composer.json 範本(僅列出重點):

{
"name": "XXX",
"description": "OOO",
//...
"require": {
"php": ">=7.1.0",
"yiisoft/yii2": "~2.0.6",
"moonlandsoft/yii2-phpexcel": "*",
"yiisoft/yii2-redis": "^2.0",
},
"require-dev": {
"yiisoft/yii2-debug": "~2.0.0",
},
"config": {
"process-timeout": 1800,
//...
},
}

composer.lock

composer.lock 是在實際執行下載依賴套件時生成的檔案,裡面詳細記錄了要下載的所有依賴項目的各種資訊,包括名稱、版本號、下載路徑、該依賴項目的依賴項目,以及其許可證等。此外,檔案的最上方還有內容的 hash 值(content-hash)。

由於 composer.lock 的內容比 composer.json 更為詳細,因此也會納入 Git 版控之中。原則上,這個檔案的內容一般不會被手動修改。簡單來說,可以將 composer.json 視為是給工程師看的,而 composer.lock 則是給電腦處理的。

autoload.php

當所有依賴項目完全下載完成後,vendor 資料夾底下會生成一個 autoload.php 檔案,內容主要是這次下載的 hash 值。當我們在程式碼中引用依賴套件時,會根據這個 hash 值找到 vendor/composer 裡的相關設定,並接著找到所需的依賴項目內容。

簡單來說,如果沒有 autoload.php,則表示你的依賴項目下載不完整,這樣程式碼將無法運行。

如何運作 - 下載目前專案的依賴

確認 composer.json 與 composer.lock

如上所述,當你 git clone 專案後,第一件事是確認 composer.jsoncomposer.lock 這兩個檔案是否存在。如果都存在,基本上可以放心執行 composer install 來進行下載[註2]。如果只有 composer.lock,那麼在下載依賴時基本上沒有問題,但在未來的更新和維護上會相對麻煩。如果只有 composer.json,那…你可能需要祈禱之前的同事們都已更新這個檔案,讓你能下載到正確的依賴版本。

下載依賴並產出 autoload.php

確認檔案後,就可以直接執行 composer install 了!下載完成後,請務必確認是否產生了 autoload.php 檔案。因為有時候依賴項的內容龐大,可能會導致超時失敗,此時可以調整 composer.json 中的超時設定,以避免這個問題。

原則上,只要有 autoload.php,就表示依賴下載完成,專案可以正常使用了。

如何運作 - 更新目前專案的依賴

升級(包括更新依賴項目版本)的細節有很多,之後我會額外撰寫一篇文章詳述,這裡僅大致描述步驟。

調整 composer.json

首先,你需要確認要調整的依賴項目以及希望更新到的版本。一般建議盡量直接指定詳細的版本號碼,而非僅指定大版本號碼,這樣可以避免因更新時間過長而導致依賴項目有額外的更新內容,進而造成本地開發正常使用但正式環境出現問題的情況。

更新composer.lock

接下來,你需要更新 lock 檔,主要有兩種方法(請注意指令不同):

  1. 執行更新指令:使用 composer update 依賴項目 讓程式自動抓取並更新 lock 檔內容,並一併更新相關依賴項目。需要注意的是,這個指令必須指定要更新的項目,否則會將所有可更新的依賴項目全部進行更新。
  2. (不推薦) 刪除 lock 檔部分或全部內容:直接刪除 lock 檔中要更新的內容,甚至是整個檔案,然後執行 composer install 來重新產生 lock 檔案並下載依賴項目。這種方法非常危險,因此不太推薦。但有時候,lock 檔裡面有一些前人留下的奇怪內容,此舉可以重整整個 lock 檔。

確認更新內容

按照上述方法執行後,檔案內容應該會有所更新,包括檔案內容的 hash 值。接下來,你需要測試更新後的功能是否正常,確認是否有意料之外的錯誤,以及單元測試是否通過等。

要注意的是,composer.lock 也應該納入版控,以造福下一位接手的工程師!!!

[註1] 筆者曾經遇過一個極端的專案,由於大量引用開源功能,整個專案的90%內容都依賴於開源項目。在這種情況下,將其納入 Git 版控顯然不是一個明智的選擇。

[註2] 筆者曾遇過兩個檔案中的套件版本不相符的情況,最終不論使用 composer.json 還是 composer.lock 下載依賴都無法成功執行專案。那時候只能請前輩將整個 vendor 資料夾的內容轉給我,但顯然這樣的專案未來也非常難以進行套件更新。

參考資料

  1. https://docs.phpcomposer.com/00-intro.html
  2. https://blog.csdn.net/somestill/article/details/50396310
avatar-img
2會員
29內容數
test
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
林柏宇的沙龍 的其他內容
本文探討PHP中的類別、介面和抽象類別的基本概念與差異。雖然這些知識可能對初學者幫助不大,但對於資深工程師來說,理解這些概念有助於建立更加優雅的架構和維持代碼的整潔。內容涵蓋了類別的封裝、繼承、多型,及介面和Traits的使用規範,提供程式設計師在日常開發中的參考和指導。
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
本文介紹了一些在 PHP 中常用的函數,如匿名函數、isset()、empty() 和 is_null(),並解釋了可變變數、引用賦值及 array 的建立方法。此外,還提到 PHP 8.0 中的新特性 Nullsafe,幫助開發者更方便地處理空值判斷。
在本文中,我們將介紹PHP中的各種屬性與方法,包括訪問修飾符、方法修飾符,以及魔術方法的使用。你將學習到public、private和protected的區別,以及static、final、abstract等方法的特點。同時,我們會簡要提到PHP 8.1中新增的readonly屬性修飾符及其用途。
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
在軟體開發中,客戶經常會遇到無法訪問公司網頁的問題,但這類問題常常難以從日誌中查找解決方案。本文探討了有效的解決方式,特別是利用HTTP Archive(HAR)檔案來分析問題根本,幫助客戶瞭解問題的來源,包括使用有用的工具來進行資訊解析。透過案例與經驗分享,讓讀者能更有效地應對類似挑戰。
本文探討PHP中的類別、介面和抽象類別的基本概念與差異。雖然這些知識可能對初學者幫助不大,但對於資深工程師來說,理解這些概念有助於建立更加優雅的架構和維持代碼的整潔。內容涵蓋了類別的封裝、繼承、多型,及介面和Traits的使用規範,提供程式設計師在日常開發中的參考和指導。
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
本文介紹了一些在 PHP 中常用的函數,如匿名函數、isset()、empty() 和 is_null(),並解釋了可變變數、引用賦值及 array 的建立方法。此外,還提到 PHP 8.0 中的新特性 Nullsafe,幫助開發者更方便地處理空值判斷。
在本文中,我們將介紹PHP中的各種屬性與方法,包括訪問修飾符、方法修飾符,以及魔術方法的使用。你將學習到public、private和protected的區別,以及static、final、abstract等方法的特點。同時,我們會簡要提到PHP 8.1中新增的readonly屬性修飾符及其用途。
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
在軟體開發中,客戶經常會遇到無法訪問公司網頁的問題,但這類問題常常難以從日誌中查找解決方案。本文探討了有效的解決方式,特別是利用HTTP Archive(HAR)檔案來分析問題根本,幫助客戶瞭解問題的來源,包括使用有用的工具來進行資訊解析。透過案例與經驗分享,讓讀者能更有效地應對類似挑戰。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
本章節旨在介紹如何在不同操作系統上安裝和配置PHP環境,並使用命令行工具進行基礎操作。此外,還介紹了使用Visual Studio Code進行PHP開發的步驟,包括安裝擴展和設置調試環境。
Thumbnail
在本節中,我們介紹了PHP的基本語法,包括如何在HTML中嵌入PHP代碼,PHP腳本的執行順序,以及多種註解方式。我們還學習了如何定義和使用變數,包括單個變數和多個變數的賦值方法。這些基礎知識將幫助你開始使用PHP進行Web開發。
Thumbnail
這個章節介紹了PHP的基本特性和應用領域,並且列舉了使用PHP的知名公司和網站。了解PHP的簡單易學、跨平台、嵌入HTML等特性,以及PHP在動態網站、電子商務、內容管理系統、社交媒體平台、數據庫管理和API開發中的應用。
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Thumbnail
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
PHP(Hypertext Preprocessor)是一種流行的開源腳本語言,特別適用於網頁開發。它具有簡單的語法和易於理解的程式碼結構,並且支持多種數據庫系統和其他技術和框架集成。本文將介紹PHP的主要特點和廣泛應用性。
composer dump-autoload 是 Composer 工具的指令,用於重新生成自動載入檔案,以確保專案中的類別檔案能夠正確載入。透過執行該指令,Composer會根據專案的 composer.json 檔案中的設定重新生成 vendor/autoload.php 檔案。這個指令不會安裝
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
本章節旨在介紹如何在不同操作系統上安裝和配置PHP環境,並使用命令行工具進行基礎操作。此外,還介紹了使用Visual Studio Code進行PHP開發的步驟,包括安裝擴展和設置調試環境。
Thumbnail
在本節中,我們介紹了PHP的基本語法,包括如何在HTML中嵌入PHP代碼,PHP腳本的執行順序,以及多種註解方式。我們還學習了如何定義和使用變數,包括單個變數和多個變數的賦值方法。這些基礎知識將幫助你開始使用PHP進行Web開發。
Thumbnail
這個章節介紹了PHP的基本特性和應用領域,並且列舉了使用PHP的知名公司和網站。了解PHP的簡單易學、跨平台、嵌入HTML等特性,以及PHP在動態網站、電子商務、內容管理系統、社交媒體平台、數據庫管理和API開發中的應用。
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Thumbnail
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
PHP(Hypertext Preprocessor)是一種流行的開源腳本語言,特別適用於網頁開發。它具有簡單的語法和易於理解的程式碼結構,並且支持多種數據庫系統和其他技術和框架集成。本文將介紹PHP的主要特點和廣泛應用性。
composer dump-autoload 是 Composer 工具的指令,用於重新生成自動載入檔案,以確保專案中的類別檔案能夠正確載入。透過執行該指令,Composer會根據專案的 composer.json 檔案中的設定重新生成 vendor/autoload.php 檔案。這個指令不會安裝