在現代 PHP 開發中,Composer 是事實標準的依賴管理工具。而 composer.lock 文件往往被初學者忽視,實際上它是保證「所有開發者、CI 服務器、生產環境使用完全一樣的依賴版本」的關鍵。本文將系統講解 Composer 基礎工作流、composer.lock 的生成機制、核心作用以及最佳實踐。
項目根目錄下的 composer.json 用於聲明項目所需的包及其版本約束:
{
"require": {
"monolog/monolog": "1.0.*"
}
}
供應商名/項目名(如 monolog/monolog),供應商名全局唯一。1.0.2)、範圍(>=1.0, <2.0)、通配符(1.0.*)、波浪號(~1.2 相當於 >=1.2, <2.0)等。composer install執行後,Composer 會解析依賴圖,下載包到 vendor/ 目錄,並生成 vendor/autoload.php 實現 PSR-4 自動加載。
執行 composer install 後自動生成的文件,記錄了**當前安裝的每一個包的具體版本號、下載鏈接、依賴關係樹、內容哈希**等元數據。它將 composer.json 中的「模糊版本約束」具體化為「精確版本」。
composer.lock 存在時,composer install 會**完全忽略 composer.json 的版本約束**,直接讀取 lock 文件安裝記錄的精確版本。這意味著無論何時、何地、誰執行安裝,得到的 vendor/ 目錄內容完全一致。| 場景 | 命令 | 行為 |
|---|---|---|
| 全新克隆項目 / CI 構建 / 部署生產 | composer install | 讀取 composer.lock,安裝鎖定版本,**不解析 composer.json** |
| 新增依賴包 | composer require vendor/pkg | 更新 composer.json,**同時更新 composer.lock**,安裝新包 |
| 升級所有包到最新兼容版本 | composer update | 重新解析 composer.json 約束,獲取最新版,**重寫 composer.lock** |
| 升級指定包 | composer update vendor/pkg | 僅更新該包及其依賴,**更新 composer.lock** 相關部分 |
| 批量升級某供應商包 | composer update vendor/* | 通配符匹配升級 |
composer require/update 產生的 lock 文件 diff 可直觀看到具體升級了哪些版本,是否引入了新依賴。composer install --no-dev --optimize-autoloader —— 生產環境不安裝 dev 依賴,並優化自動加載映射。Composer 生成的 vendor/autoload.php 實現了 PSR-4 標準。只需在入口文件 require 'vendor/autoload.php'; 即可直接使用任何已安裝包的類。也可在 composer.json 中配置項目自身的命名空間映射:
{
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
修改後需執行 composer dump-autoload 重新生成映射。
composer.lock 是 PHP 項目依賴管理的「基石」。它將不確定的版本約束轉化為確定的軟體物料清單(SBOM),保證了構建的可重現性與環境一致性。記住鐵律:**開發階段用 update 探索新版本,部署階段只用 install 落地鎖定版本。**