vendor目录离线包本质是composer install --no-dev后的完整快照,必须基于composer.lock、禁用dev依赖与脚本,并确保dist模式和环境一致性。

vendor 目录离线包本质是 composer install --no-dev 后的完整快照
离线包不是特殊产物,就是你在目标环境能直接用的 vendor/ 文件夹。关键在于「锁定依赖版本」和「排除干扰项」:必须基于 composer.lock 安装,且不能带 dev 包(否则上线时可能拉不到私有库或触发脚本失败)。本地生成时若没加 --no-dev,会把 phpunit、phpstan 这类开发依赖也塞进去——它们不仅体积大,还可能因扩展缺失导致 autoload 报错。
实操建议:
- 确保项目根目录存在有效的
composer.lock(运行过composer update或composer install) - 执行
composer install --no-dev --optimize-autoloader --ignore-platform-reqs -
--optimize-autoloader生成vendor/composer/autoload_classmap.php,减少运行时文件查找开销 -
--ignore-platform-reqs避免因本地 PHP 版本/扩展与目标环境不一致而中断(比如你本地是 PHP 8.2,但生产是 7.4)
私有包(GitLab/GitHub)必须用 dist 模式打离线包
如果 composer.json 里引用了私有仓库(如 "my/package": "dev-main"),默认会走 source 模式——即克隆 Git 仓库。这在离线环境完全不可行,且打包时会漏掉 .git 目录导致后续 composer install 失败。
解决方法是强制所有包走 dist(压缩包)下载:
- 运行前加环境变量:
COMPOSER_PREFERS_DIST=1 - 或在
composer.json中显式配置:"prefer-stable": true, "prefer-dist": true - 验证是否生效:安装后检查
vendor/my/package/下有没有.git目录;没有则成功 - 若仍走 source,检查该包是否在
composer.lock中"source"字段存在 —— 需先删掉composer.lock和vendor/,再重新composer update --prefer-dist
打包前务必清理无用文件,否则体积暴涨
vendor/ 里藏着大量非运行必需内容:测试文件、文档、示例、.git 目录、未压缩的源码包(如 laravel/framework 的 tests/ 占 30MB+)。不清理会导致离线包体积翻倍,传输慢、解压失败风险高。
推荐组合清理命令(Linux/macOS):
find vendor -name "*.md" -o -name "*.txt" -o -name "tests" -o -name "Tests" -o -name ".git" | xargs rm -rf find vendor -name "phpunit*" -o -name "phpstan*" -o -name "psalm*" | xargs rm -rf rm -rf vendor/bin/*
注意:vendor/bin/ 通常只留 phpstan 等开发工具,线上不需要;但如果你用了 laravel/sail 或 spatie/laravel-backup 的可执行命令,得保留对应二进制文件。
离线部署时 composer install 必须加 --no-scripts
很多包在 post-install-cmd 里写死要执行 php artisan optimize 或 npm run dev,离线环境缺 Node.js 或 Laravel 命令就会卡住甚至失败。这不是 bug,是设计使然——Composer 不区分“在线初始化”和“离线复用”。
所以部署命令只能是:
composer install --no-dev --no-scripts --no-interaction
常见陷阱:
- 漏掉
--no-scripts:遇到Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1就知道错了 -
--no-interaction必须带上,否则某些包会交互式询问配置(如symfony/flex) - 别试图在离线机上跑
composer update—— 没网络,必然报Could not fetch https://repo.packagist.org/packages.json
真正可靠的离线流程,是把 vendor 当作构建产物,而非运行时动态生成物。最容易被忽略的点是:锁文件版本、dist 模式、清理策略这三者必须同步验证,差一个,上线就可能出 silent failure。











