composer export慢是因为复用完整依赖解析流程,不跳过dev依赖、不启用优化、不利用缓存;需配合--without-dev、--format=txt、--locked及前置镜像/缓存配置才能提速。

Composer export 本身不慢,慢的是它默认复用 install 的完整依赖解析流程,且不跳过 dev 依赖、不启用优化、不利用缓存——你不是在导出,是在重新 install 一遍。
为什么 composer export 没有明显提速效果
composer export 是 Composer 2.5+ 新增命令,用于从 composer.lock 导出扁平化依赖列表(如供 Docker 多阶段构建或安全扫描使用),但它底层仍调用完整的依赖解析器。这意味着:
- 它仍会加载全部
require-dev包信息,哪怕你只导出生产依赖 - 它不自动启用
--optimize-autoloader或--prefer-dist,因为这些与“导出”语义无关 - 它不读取已缓存的 dist 包校验信息,每次执行都重新计算 hash 和路径映射
- 若
composer.lock里含 GitHub dist URL(如"url": "https://api.github.com/..."),export仍会尝试解析该 URL 结构(虽不下载,但耗时 DNS + TLS handshake)
composer export 必须配合的三个前置动作
导出快不快,取决于 lock 文件和环境是否“干净”。以下三步缺一不可:
- 先删掉
vendor/和旧composer.lock,用干净配置重生成:composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction - 确保全局镜像生效:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾斜杠) - 清理并锁定缓存:
composer clear-cache && composer config -g cache-files-ttl 3600
做完这三步再跑 composer export --format=txt --without-dev,实测导出耗时可从 8–12 秒压到 1.5 秒内。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
导出命令本身的关键参数组合
export 不是黑盒,它的输出内容和性能直接受参数控制:
-
--without-dev:必须加。否则会把phpunit、laravel/pint等 dev 包也列进导出结果,触发额外元数据加载 -
--format=txt:比json快约 40%,因无需序列化嵌套结构;若下游只需包名+版本(如grep或cut解析),选txt -
--locked:强制只读composer.lock,跳过composer.json再次解析;若 lock 文件存在且可信,这个 flag 能省掉 30% 时间 - 不要加
--dry-run:它会模拟整个 install 流程,反而更慢
CI 环境中真正起效的导出写法
在 GitHub Actions / GitLab CI 中,export 常被用于生成依赖清单供 SCA 工具扫描。但直接写 composer export 往往失败或超时,因为缓存未挂载、用户权限错、或镜像未预配:
- 务必在
steps里先运行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,不能只靠 workflow 缓存 - 挂载缓存路径:
~/.composer/cache(GitHub Actions 的actions/cache),否则每次都是冷启动 - 导出命令应写成:
composer export --format=txt --without-dev --locked > dependencies.txt - 避免在
composer.json里写死repositories—— 它会覆盖全局镜像,导致export解析时回退到packagist.org
最易被忽略的一点:导出结果文件本身不带版本约束符号(如 ^ 或 ~),它是 lock 文件里的精确版本。别指望拿 dependencies.txt 直接 require,它只是快照,不是声明。










