因为composer archive命令根本不存在,它既非Composer内置命令也未被社区实现;真正可用的打包起点是执行composer install --no-dev --optimize-autoloader --prefer-dist后生成的vendor目录。

为什么不能直接用 composer archive 打包?
因为 composer archive 命令根本不存在——它不是 Composer 的内置命令,社区也从未实现过。有人误以为它能生成可部署包,结果解压后 vendor/autoload.php 缺失、类无法自动加载、composer install 一跑就报错。真正可用的打包起点,永远是执行完 composer install --no-dev --optimize-autoloader 后的 vendor/ 目录。
生产环境打包前必须执行的三步清理与安装
直接在已有 vendor/ 上打包,极大概率混入开发依赖或未优化的 autoloader。正确流程是:
-
rm -rf vendor/:清空旧状态,避免残留干扰 -
composer install --no-dev --optimize-autoloader --prefer-dist:关键参数缺一不可
—--no-dev过滤掉phpunit、roave/security-advisories等非运行时依赖
—--optimize-autoloader(或-o)生成 classmap,autoload 性能提升 3–5 倍
—--prefer-dist强制下载 ZIP 包而非 Git 克隆,更快更稳定 - 再用系统命令打包:
zip -r myapp-prod.zip . -x "node_modules/*" -x ".git/*"或git archive --format=zip HEAD > myapp-prod.zip
离线部署时,光复制 vendor/ 是不够的
单纯把本地 vendor/ 拷到离线机,composer install 仍可能触发网络请求——比如插件初始化、autoload 重建、或 post-install-cmd 脚本。可靠做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在联网机执行:
composer install --no-install --prefer-dist --no-scripts,把所有 dist ZIP 下载到vendor/composer/cache/files/ - 一并提取
vendor/composer/cache/repo/https---packagist.org/packages.json,它是离线时解析包路径的关键映射表 - 离线机用:
composer install --repository-url=file:///path/to/local/dist,让 Composer 完全离线工作
CI/CD 流水线里最容易被忽略的两个检查点
很多构建失败不是因为命令写错,而是漏掉了这两件事:
-
ls -la composer.lock:确认 lock 文件存在且未被.gitignore忽略;一旦缺失,composer install就退化为composer update行为 -
git status --porcelain composer.lock:检查 lock 是否被意外修改(比如本地误执行了composer require),CI 构建应拒绝提交含变更 lock 的分支
打包发布这件事,核心不在“怎么压缩”,而在“压缩前的状态是否干净、可复现”。任何跳过 --no-dev 或漏掉 --optimize-autoloader 的操作,都会让线上服务多出几十 MB 无用代码,或慢上好几倍。

















