嵌入式设备上vendor目录过大,必须从源头裁剪:先安装composer-archive-excludes插件,配置archive.excludes过滤/tests/、/docs/等路径,再执行composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative,并用replace替代虚拟包、清理vendor/bin。

嵌入式设备上跑 Composer 项目,vendor/ 目录动辄百 MB,根本塞不进 flash 或内存受限的系统——这不是配置没调好,是默认行为根本没考虑资源约束。必须从安装源头掐断冗余文件落地,不能靠事后删。
为什么 composer install --no-dev 在嵌入式设备上依然失败
它只跳过 require-dev 声明的包,但不碰这些包的传递依赖(比如 laravel/framework 拉进来的 symfony/var-dumper),更不会清理每个包里的 /tests/、/docs/、.git 目录。这些内容在嵌入式环境里毫无意义,却占掉 60%+ 空间。
-
--no-dev不影响 dist 包解压行为,所有 zip 文件仍按原始结构完整释放 - 很多 IoT 依赖(如
amphp/mqtt、react/socket)自带大量示例和测试代码,且未在autoload中声明,dump-autoload也扫不到它们 - Alpine 镜像下若用
apk add composer,Alpine 3.16+ 已移除该包,硬装会报ERROR: unable to select packages,必须走curl安装路径
嵌入式设备必须启用 archive.excludes 配置
这是唯一能从 zip 解压阶段就过滤掉无用路径的方式。手动 find vendor/ -name tests -exec rm -rf {} + 在只读文件系统或 overlayfs 下会失败,且容易误删 autoload 所需路径(比如 monolog/monolog 的 tests/StreamHandlerTest.php 是 runtime 示例加载源)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json的config块中添加:"archive": { "excludes": ["/tests/", "/Tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md", "/README.md"] } - 必须先执行
composer require --dev composer-archive-excludes插件,否则该配置无效 - 改完要跑
composer update --lock再composer install --no-dev --prefer-dist,否则旧composer.lock会跳过归档逻辑 - 注意路径必须以
/开头和结尾,tests或test/都不匹配
嵌入式构建必须用 --classmap-authoritative + --optimize-autoloader
没有这个组合,PHP 运行时仍会遍历整个 vendor/ 目录找类——哪怕 /tests/ 已被 archive.excludes 跳过,扫描失败也可能导致 Class not found 错误,尤其在 NFS 或 squashfs 只读挂载下。
-
"optimize-autoloader": true必须写进composer.json的config块,不是仅加命令参数 -
composer install --no-dev --optimize-autoloader --classmap-authoritative是最小安全集,缺一不可 - 别信
composer dump-autoload --optimize能替代安装命令——它只更新映射,不触发重新解压和裁剪 - 如果某包 autoload 同时声明了
psr-4和classmap(常见于老 Laravel 扩展),检查其composer.json是否把tests/放进了classmap数组,这种得 fork 后删掉再发布私有版
嵌入式部署前必须清理 vendor/bin 和虚拟包
vendor/bin 里一堆脚本(phpunit、phpcs、phinx)每个都带独立依赖树,解压后占几 MB,在嵌入式设备上纯属冗余;而 psr/log、psr/container 这类接口包,若你已用轻量实现替代,就不该再下载空壳。
- 运行
rm -rf vendor/bin/*安全,只要不调用这些命令,它们对 runtime 无影响 - 用
replace替代虚拟包:在composer.json的replace字段声明"psr/log": "3.0.0",Composer 就不会下载官方实现 - 验证是否生效:
composer show psr/log应返回Package psr/log is replaced by root package. - 别用
provide单独声明——它不阻止别人require,真正想排除得配conflict
嵌入式设备的体积裁剪,核心不是“删什么”,而是“不让它落地”。archive.excludes 控制解压源头,--classmap-authoritative 关闭 runtime 扫描,replace 切断虚拟依赖链——三者缺一不可。任何一步漏掉,都可能让一个 /tests/ 目录卡住整个部署流程。

















