composer 默认用 dist(zip)安装,加 --prefer-source 可全局改用 git clone;若仅单个包需 source,应在 repositories 中设 type: "vcs" 并指定可写 git 地址,再 composer update vendor/package。

composer install 时怎么让包走 git clone 而不是 zip 下载
默认情况下,Composer 安装依赖会优先从 packagist.org 拉取压缩包(dist),速度快但没法改源码。想边调试边改第三方包,必须强制它走 source —— 也就是用 git clone 拉仓库。
最直接的办法是加 --prefer-source 参数:
composer install --prefer-source
这个参数只对当前命令生效。如果已经装过(vendor 里有包了),得先删掉再重装,否则 Composer 会跳过已存在的包。
-
--prefer-source是全局开关,会影响所有包,不只是你打算改的那个 - 如果某个包没提供
source地址(比如只有dist配置、或type不是vcs),Composer 会退回到dist,不会报错 - 某些私有包或 fork 后未更新
composer.json的仓库,可能sourceURL 指向的是只读地址,git clone成功但后续git pull或checkout会失败
怎么只让某一个包走 source,其他照常 dist
不需要全局 --prefer-source,也能精准控制单个包。关键是改 composer.json 的 repositories 配置,把它“伪装”成一个本地或可写仓库。
比如你想改 monolog/monolog,可以这样写:
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/Seldaek/monolog"
}
],
"require": {
"monolog/monolog": "^2.10"
}
}
关键点:type: "vcs" 会让 Composer 自动选择 source 方式安装;哪怕你本地没改任何东西,它也会 git clone 下来。
- 确保
url是真实可git clone的地址(支持 HTTPS / SSH),且对应分支存在 - 如果该包在 packagist 上版本号和你
url仓库的 tag 对不上,Composer 可能报Could not find package,这时得加"no-api": true或换用package类型手动声明版本 - 改完
composer.json后,运行composer update monolog/monolog即可,不用删vendor
克隆完怎么确认它真能改、能提交
装完后进 vendor/xxx/xxx 目录,别急着改代码,先验证三件事:
- 执行
git status:应该显示 clean,且 remote 是你期望的地址(比如 github.com/xxx/xxx) - 执行
git remote -v:确认 fetch 和 push 地址都可写(尤其是如果你 fork 了原项目,要改成自己的 SSH 地址) - 执行
git log -n 1:核对 commit hash 是否和你composer show xxx/xxx输出的source字段一致
常见坑:composer install 后 git remote 指向的是只读地址(如 https://github.com/xxx/xxx.git),push 会失败。这时要手动 git remote set-url origin git@github.com:yourname/xxx.git。
改完代码怎么让项目立刻生效,不重装
改完 vendor 里的代码,PHP 自动加载器(如 Composer 的 ClassLoader)默认不会重新扫描——它靠 vendor/autoload.php 和生成的 autoload_static.php 映射,这些文件在 composer dump-autoload 时才更新。
但绝大多数情况你根本不需要重生成 autoload,只要确保:
- 你改的是运行时实际加载的文件(比如
use Monolog\Logger;对应的vendor/monolog/monolog/src/Logger.php) - 没有 OPcache 缓存旧字节码:开发环境建议关掉
opcache.enable,或改完后执行opcache_reset() - 如果是 Laravel 等框架,注意它可能把配置或类映射缓存了,需要
php artisan config:clear或php artisan clear-compiled
真正需要 composer dump-autoload 的场景,一般是新增了 class 文件但命名空间没按 PSR-4 规则放,或者你手动改了 autoload 配置。
复杂点在于:一旦你 push 了修改,别人 composer install 默认还是拉原始包。要长期协作,得把 fork 地址 + 版本别名(如 dev-your-branch as 2.10.0)写进 composer.json,否则下次 update 就丢了。










