composer install 无法按扩展名排除文件,因其职责仅限依赖解析与包解压,不扫描过滤文件内容;真正控制文件是否进入 vendor/ 的唯一方式是包作者在发布时通过 archive.exclude 或 .gitattributes 配置。

Composer 命令本身不支持在 install 或 update 时按文件扩展名(如 .md、.txt、.phpunit.xml)动态过滤或跳过下载——它没有 --exclude-ext=*.md 这类参数,也不存在运行时“忽略扩展名”的机制。
为什么 composer install 无法按扩展名排除文件
Composer 的职责是解析依赖关系、下载包、写入 vendor/ 并生成自动加载器。它不扫描或过滤已下载包内的文件内容;所有文件(包括 .git、tests/、docs/、.md)都会原样解压进来。所谓“排除”,必须发生在包发布阶段,而非你本地安装时。
-
archive.exclude配置只影响包作者执行composer archive或 Packagist 自动生成 dist 包的过程,对你执行composer install完全无效 -
.gitattributes中的export-ignore仅控制git archive输出,而 Composer 的 dist 下载依赖 Git 归档,但你无法用它干预已发布的旧版本 - 试图用
post-install-cmd删除特定扩展名文件(如find vendor -name "*.md" -delete)可行,但属于事后清理,不是“安装时忽略”
真正能控制文件是否进入 vendor/ 的地方只有包作者侧
如果你是包维护者,想让下游用户安装时不带 .md 或 .dist 文件,必须在你自己的包里配置:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json中声明:"archive": {"exclude": ["/README.md", "/CHANGELOG.md", "/*.dist"]} - 或在
.gitattributes中写:/README.md export-ignore - 两者都需打新 tag(如
v3.2.1),否则旧版本 dist 包仍含这些文件 - 注意路径必须以
/开头,不支持通配符如**/*.md
作为使用者,你能做的实际操作只有两种
如果你只是想精简 vendor/ 体积(比如部署到生产环境),可选方案很明确:
- 用
post-install-cmd脚本批量删除:例如"rm -rf $(find vendor -name '*.md' -o -name '*.txt' -o -name 'phpunit.xml'),但需注意 Windows 环境建议改用 PHP 脚本 - 用
exclude-from-classmap让自动加载器跳过某些路径(不影响文件存在):例如"exclude-from-classmap": ["/tests/", "/docs/", "/examples/"],然后运行composer dump-autoload -o - 别指望
composer install --no-dev能删掉.md——它只跳过require-dev中的包,和文件扩展名无关
最常被忽略的一点:你删掉的 .md 文件,下次 composer update 会原样恢复。除非你把清理逻辑固化进 CI 脚本或部署流程,否则它永远只是临时手段。










