composer 没有 archive 命令,执行会报错;官方从未提供该功能,所谓教程多为混淆 git archive 或误用过时插件;标准打包流程是先 composer install --no-dev --optimize-autoloader,再用 zip 等工具手动归档并排除敏感文件。

Composer 根本没有 archive 命令
你执行 composer archive 一定会看到报错:Command "archive" is not defined. ——这不是你环境没装好,是它压根就不存在。官方文档里查不到,Composer 2.2+ 所有稳定版本都不提供这个命令。网上那些“教程”要么是混淆了 git archive,要么是误用了第三方脚本或旧版插件(比如早已停更的 composer-archive 工具),甚至有些是把 composer pack(实验性)或 Packagist 内部构建逻辑当成了用户功能。
真正能打包项目的标准流程
生产部署要的是「精简、可控、可验证」,不是「少敲一行命令」。可靠做法永远是两步走:
- 先运行
composer install --no-dev --optimize-autoloader --prefer-dist:确保vendor/只含运行时依赖,且自动加载器被扁平化优化(vendor/composer/autoload_classmap.php等已生成) - 再用系统工具归档,明确排除无关内容:比如
zip -r myapp.zip . -x ".git/*" -x "tests/*" -x "phpunit.xml*" -x "docker/*"
注意:composer.lock 是否打包取决于你是否需要离线安装——多数 CI/CD 流程会保留它;而 .env 这类本地配置文件必须手动确认不被打包进去,否则上线就泄露密钥。
composer pack 是什么?能直接用吗?
composer pack 是 Composer 2.5+ 引入的实验性命令,不是 archive 的替代品,它的设计目标是为包分发(如私有仓库)生成带 vendor/ 的完整 zip,而非项目部署包。它默认只打包当前项目源码(不含 vendor/),且输出路径固定为 vendor-bin/{name}-{version}.zip,不能自由指定目录或文件名。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它读取
composer.json中的"archive": {"exclude": [...]}配置,但该字段仅被pack和少数 CI 工具识别,git archive或手动zip不认 - 它不会自动执行
composer install,也不会优化 autoloader——你得自己先跑一遍 - 如果你只是想打个发布包,用
composer pack反而多一层不可控环节,不如直接写scripts调用zip
最稳的自动化方案:用 composer run 封装脚本
在 composer.json 的 "scripts" 里加一条清晰、无隐式依赖的命令,比任何“黑盒命令”都靠谱:
"scripts": {
"package": [
"@composer install --no-dev --optimize-autoloader",
"zip -r myapp-$(date -I).zip . -x \"*/.git/*\" -x \"tests/*\" -x \"phpunit.xml*\" -x \"Dockerfile\""
}
}
然后运行 composer run package(Composer 2.5+)或 composer run-script package(旧版)。关键点:
- 所有动作可见、可调试、不依赖外部插件
-
$(date -I)生成 ISO 格式日期(如2026-03-26),比靠版本号更可控 - 排除路径用
\"*/.git/*\"而非\".git/*\",避免漏掉子模块中的.git
最容易被忽略的其实是验证环节:打包完务必在干净目录里解压,然后跑一次 php -r "require 'vendor/autoload.php'; echo 'OK';" ——很多问题直到上线才暴露,不是因为没打包对,而是 autoload 没生效、或漏删了本地配置。










