直接导出所有依赖的离线归档包不能用 composer archive,因其仅打包项目源码、忽略 vendor/ 且不解析 composer.lock;正确方法是解析 composer.lock 后对每个已安装包执行 composer archive,或更可靠地直接打包整个 vendor/ 目录加 composer.lock。

直接导出所有依赖的离线归档包,不能用 composer archive —— 它只打包当前项目源码,不碰 vendor/ 里的任何依赖。
为什么 composer archive 不行
这个命令设计目标就是“源码发布归档”,行为等价于 git archive:它读取 composer.json 的 version 和 archive.exclude,只打包项目根目录下符合规则的文件。vendor/、node_modules/、.git/ 全被默认排除,且不会解析或读取 composer.lock。
常见误操作:
- 在项目根目录执行 composer archive --format=zip,结果 zip 里只有 src/、composer.json,没有一个依赖包
- 以为加了 --with-dependencies(该参数根本不存在)就能包含 vendor
真正能导出所有依赖包的方法:用 composer archive 配合 composer.lock 解析
必须手动遍历 composer.lock 中每个包,把它们各自当成独立项目去打 zip 包。这需要两步:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 从
composer.lock提取每个包的name、version、dist.url(或source.type+source.url),但更可靠的是直接读取已安装的vendor/{vendor}/{package}/composer.json - 对每个包目录执行
composer archive --format=zip --dir=../zips,前提是该目录下有合法composer.json且含version字段 - 若原始包没
version(比如来自 Git 的 dev-master),需先补全:脚本读composer.lock对应条目的version,写回其composer.json
示例关键逻辑(PHP 脚本片段):
foreach ($lock['packages'] as $pkg) {
$path = "vendor/{$pkg['name']}";
if (!is_dir($path)) continue;
$json = json_decode(file_get_contents("$path/composer.json"), true);
$json['version'] = $pkg['version']; // 强制写入 lock 中的精确版本
file_put_contents("$path/composer.json", json_encode($json, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
exec("cd $path && composer archive --format=zip --dir=../../zips");
}更稳的替代方案:直接打包 vendor/ + composer.lock
如果目标只是离线部署而非生成“可复用的 zip 包仓库”,复制整个 vendor/ 目录比逐个打 zip 更快、更可靠:
- 确保源机执行过
composer install --no-dev --optimize-autoloader,且vendor/autoload.php可正常加载类 - 打包时包含
vendor/和composer.lock,目标机无需 Composer 运行网络请求 - 目标机只需运行
composer install --no-interaction --no-plugins --no-scripts --no-dev,它会跳过下载,仅校验和注册 autoload - 注意:PHP 版本(含小版本)、关键扩展(
mbstring、openssl)、Composer 版本必须一致,否则可能Class not found
真正要生成“所有依赖的离线归档包”,本质是构建 artifact 仓库,不是单次导出——composer archive 只是其中一环,且必须配合 composer.lock 解析和批量处理逻辑。漏掉任何一个子依赖(比如 psr/log),离线环境就会卡在 “Package not found”。

















