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
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
43內容數
test
林柏宇的沙龍的其他內容
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
本文章詳細介紹了 PHP 的依賴管理工具 Composer 的運作原理,包括如何使用 Composer 進行下載、更新依賴的流程,並提供了在專案中正確運用這個工具的實用建議。透過本文,讀者將能夠更好地理解 Composer 的重要性及其背後的機制,確保專案運行的穩定性。
Thumbnail
本文章詳細介紹了 PHP 的依賴管理工具 Composer 的運作原理,包括如何使用 Composer 進行下載、更新依賴的流程,並提供了在專案中正確運用這個工具的實用建議。透過本文,讀者將能夠更好地理解 Composer 的重要性及其背後的機制,確保專案運行的穩定性。
Thumbnail
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
Thumbnail
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Thumbnail
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Thumbnail
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
Thumbnail
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
學習框架前第一步,先理解框架的生命週期 學習完PHP程式基礎後,就會開始進入框架的學習,為了能理解Laravel框架是如何運作的,就必須清楚框架的生命週期,這也是面試時的必考題哦。
Thumbnail
學習框架前第一步,先理解框架的生命週期 學習完PHP程式基礎後,就會開始進入框架的學習,為了能理解Laravel框架是如何運作的,就必須清楚框架的生命週期,這也是面試時的必考題哦。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News