直接复制 vendor 目录是最稳的离线方案,前提是源机与目标机 PHP 版本(含小版本)、关键扩展(mbstring、openssl、json、curl)完全一致,且 composer.lock 未修改、vendor 已通过 composer install --no-dev --optimize-autoloader 验证可用。

直接复制 vendor 目录是最稳的离线方案
只要源机和目标机的 PHP 版本(含小版本,如 8.2.12)、关键扩展(mbstring、openssl、json、curl)一致,且项目不含需编译的扩展依赖(如 ext-redis 必须已装好),vendor/ 就是可迁移资产,不是临时产物。
常见错误现象:Class not found 或 Extension missing,往往不是 Composer 问题,而是环境没对齐。
- 打包前在源机执行:
composer install --no-dev --optimize-autoloader - 用最小代码验证 autoload:
require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL'; - 目标机解压后优先运行:
composer dump-autoload -o,修复 symlink 路径或权限问题 - 若不确定 vendor 是否干净,可用:
composer install --no-plugins --no-scripts --no-autoloader --dry-run(Composer 2.5+)预览行为
必须保留 composer.lock 且不能手动改
composer.lock 是离线安装的唯一可信依据。它不存代码,只记录每个包的 dist.url 和 dist.shasum;离线时 Composer 靠这个哈希去本地缓存或 vendor 中匹配 ZIP 包。
没有 composer.lock,composer install 在离线时会报错:Could not find package in a version installable using your PHP version。
- 部署命令必须是
composer install,不是update(后者强制联网) -
vendor/必须为空或已清空——残留旧包可能引发 autoloader 冲突 - 若项目用了私有 Git 包,需提前
git clone到本地,并在composer.json中声明"type": "path"仓库
用 --no-plugins --no-scripts --no-dev 强制跳过干扰项
即使有完整 vendor/ 和 composer.lock,默认 composer install 仍可能触发插件(如 hirak/prestissimo)、脚本(如 post-install-cmd)或交互提示(如 license 确认),导致失败或卡住。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
标准离线安装命令应为:
composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
-
--no-interaction:禁用所有用户输入(避免卡在 license 确认) -
--no-plugins:不加载任何插件(防止插件尝试联网或写文件) -
--no-scripts:跳过post-install-cmd等(防止执行npm install或生成缓存) -
--no-dev:不装require-dev包,减小体积并规避 dev-only 插件
用 Satis 构建静态镜像适合长期离线运维
当需要频繁更新依赖、或有多台离线机时,vendor 复制就难维系。这时该用 satis 构建静态镜像:它生成 packages.json + ZIP 文件集合,让 Composer 认为“能访问远程源”,实际全走本地 HTTP 服务。
关键点不在“绕过网络”,而在“骗过 Composer 的源校验逻辑”。
- 构建机上执行:
composer create-project composer/satis,再配satis.json - 配置中必须设
"require-dependencies": true,否则子依赖(如psr/log)不会进镜像 - 输出目录需部署为 Web 服务(Nginx/Apache),路径要能被
http://intranet/packages/这类 URL 访问 - 离线机配置:
composer config --global repos.packages '{"type":"composer","url":"http://intranet/packages/"}',并禁用默认源:composer config --global repos.packagist.org false
最易忽略的是:Satis 不同步,只快照。每次新增包,都得重新 php bin/satis build satis.json web/,然后重推镜像目录。

















