composer install 依据 composer.lock 精确还原依赖,不查远程;composer update 忽略 lock,重新解析 composer.json 并拉取最新匹配版本。

composer install 和 composer update 有什么区别?
很多人以为 composer install 是“下载包”,composer update 是“升级包”,其实核心区别在于:是否读取 composer.lock。
-
composer install优先按composer.lock中记录的精确版本和哈希值还原依赖,不查远程仓库(除非 lock 文件不存在或缺失) -
composer update忽略 lock 文件,重新解析composer.json的版本约束,向 Packagist 或配置的源发起请求,拉取最新匹配版本 - 想拿到某个扩展包的**源码目录结构**(比如调试、打 patch),必须确保它被真正安装进
vendor/—— 而不是只在 lock 里记了一笔
怎么让 composer 下载带 .git 目录的完整源码?
默认情况下,Composer 安装包走 dist(压缩包),不带 Git 历史;只有显式要求,才会 clone 源仓库。关键在 composer.json 的 type 和 source 配置,或命令行强制指定。
- 如果包本身在
composer.json中声明了"source"字段(含url和type: "git"),且你用composer install --prefer-source,就会走 git clone - 全局设置
composer config --global prefer-source true,之后所有 install/update 默认拉源码(但会变慢,且某些私有包可能没开放 source) - 临时对单个包生效:
composer require vendor/name:dev-main --prefer-source(注意 dev 分支名要存在) - 验证是否成功:进
vendor/vendor/name/,看有没有.git/目录;运行git remote -v能看到原始仓库地址
为什么有些包加了 --prefer-source 还是没 .git?
不是所有包都提供可访问的 source 地址,也不是所有源都允许匿名 clone。常见卡点:
- 包作者没填
source字段,或者填的是私有 GitLab/GitHub Enterprise 地址,而你的机器没配对应 SSH key 或 OAuth token - Packagist 上显示 “Source” 链接 404,说明源已删或设为私有 —— 此时即使加
--prefer-source,Composer 也会自动 fallback 到 dist - 用了镜像源(如阿里云、腾讯云镜像),它们通常只同步 dist 包,不代理 git clone 请求;检查
composer config repo.packagist是否指向镜像 - 包类型是
metapackage或library但实际发布方式为 zip-only(比如某些 WordPress 插件),根本没传 source
想直接扒某个扩展包的 GitHub 仓库代码,绕过 composer?
可以,但要注意这不是 Composer 的职责,而是手动获取源码的替代路径。适合快速查看、fork 修改、或调试未发布到 Packagist 的开发中包。
- 先去 Packagist 页面搜包名(如
monolog/monolog),点进主页,找 “Source” 链接,通常跳转到 GitHub - 复制仓库地址,用
git clone https://github.com/Seldaek/monolog.git拉下来 - 若要让它被当前项目识别,需在
composer.json中加仓库配置:"repositories": [ { "type": "path", "url": "../monolog" } ]然后composer require monolog/monolog:dev-main(注意路径需是绝对或相对有效路径) - 别直接把 clone 的代码扔进
vendor/—— Composer 启动器(autoload)不认这种“硬塞”,后续dump-autoload可能失败
--prefer-source 却没 git 目录”,其实是没意识到 source 字段依赖包作者提供、且网络权限得跟上。真正可控的方式,是自己 clone + path repository,但得记得改 autoload 规则匹配新结构。









