
最近在处理一个大型php项目的部署工作时,我遇到了一个让人头疼的问题:每次部署,光是上传 vendor 目录就要花费大量时间。这个目录动辄几百兆甚至上G,里面包含了各种第三方库的测试文件、文档、示例代码、.git 目录、.travis.yml 配置等等,这些东西在生产环境中根本用不到,却白白占用了服务器空间,拖慢了部署速度。
我尝试过一些土办法,比如在部署后手动删除 vendor 目录下的 tests、docs 等文件夹,但这不仅效率低下,而且很容易遗漏或者误删,导致程序出现意想不到的问题。尤其是在CI/CD流程中,这种手动干预的方式更是不可取。我急需一个自动化、可靠的解决方案。
幸运的是,PHP社区总有大神出手相助!经过一番搜索,我发现了 liborm85/composer-vendor-cleaner 这个Composer插件,它简直是为解决我的痛点而生。
告别臃肿:liborm85/composer-vendor-cleaner 登场
liborm85/composer-vendor-cleaner 是一个Composer插件,它的核心功能是在 composer install 或 composer update 之后,自动扫描并清理 vendor 目录中那些你指定为“不必要”的文件和文件夹。它通过高度灵活的配置,让你能够精确控制哪些内容应该被移除,从而在不影响项目功能的前提下,大幅减小 vendor 目录的体积。
如何使用它让项目“瘦身”?
使用 liborm85/composer-vendor-cleaner 非常简单,主要分为安装和配置两步。
1. 安装插件
你可以选择将其安装到你的项目本地,或者全局安装。对于大多数项目,推荐本地安装,这样配置会随着项目一起管理:
<code class="bash">composer require liborm85/composer-vendor-cleaner</code>
如果你希望在所有项目中使用相同的清理规则,可以考虑全局安装:
<code class="bash">composer global require liborm85/composer-vendor-cleaner</code>
2. 配置清理规则
插件安装完成后,你需要在项目的 composer.json 文件中添加 extra.dev-files 配置项,来定义你想要清理的文件和目录。这个配置项支持强大的Glob模式匹配,让你能够非常精细地控制清理范围。
以下是一个配置示例,展示了其灵活性:
<pre class="brush:php;toolbar:false;">{ "require": { "liborm85/composer-vendor-cleaner": "^1.0" }, "extra": { "dev-files": { "/": [ // 匹配所有库包的根目录和bin目录 "tests/", // 移除所有测试目录 "docs/", // 移除所有文档目录 ".travis.yml", // 移除所有.travis.yml文件 ".github/" // 移除所有.github目录 ], "*/*": [ // 匹配所有库包目录(不包括bin目录) "*.sh", // 移除所有shell脚本文件 "CONTRIBUTING.md" // 移除贡献指南文件 ], "twig/twig": [ // 仅匹配 twig/twig 包 "doc/", // 移除其doc目录 "/drupal_test.sh" // 移除其根目录下的drupal_test.sh文件 ], "symfony/*": [ // 匹配所有symfony开头的包 "Tests/" // 移除其Tests目录 ], "example/package": [ // 匹配 example/package 包 "languages/*", // 移除languages目录下的所有文件和目录 "!languages/cs.php" // 但排除languages/cs.php文件 ] } }, "config": { "dev-files": { "match-case": true, // 是否区分文件名大小写,默认为true "remove-empty-dirs": true, // 是否移除清理后留下的空目录,默认为true "no-dev-only": false // 如果设置为true,则只在运行`composer install --no-dev`时才进行清理 } } }
配置详解:
- *键名(
"/", `”/“,"twig/twig",“symfony/“` 等)**:这些是匹配目标路径的规则。 - 值(数组):数组中的每个字符串都是一个Glob模式,用于匹配要删除的文件或目录。
-
tests/:匹配名为tests的目录。 -
*.sh:匹配所有以.sh结尾的文件。 -
!languages/cs.php:感叹号!表示排除规则,即languages目录下的所有内容都会被删除,除了cs.php文件。
-
-
config.dev-files:提供了一些额外的全局配置选项,可以进一步微调清理行为。-
match-case: 是否区分文件名大小写,默认true。 -
remove-empty-dirs: 清理后是否删除空目录,默认true。 -
no-dev-only: 如果设置为true,则只有当Composer命令带上--no-dev参数时(通常用于生产环境部署)才会执行清理。这非常有用,可以在开发环境中保留所有文件,而在生产环境自动清理。
-
你甚至可以将这些清理规则定义在一个独立的json文件中(例如 composer.dev-files.json),然后在 composer.json 中引用它:
<pre class="brush:php;toolbar:false;">{ "extra": { "dev-files": "composer.dev-files.json" } }
优势与实际应用效果
引入 liborm85/composer-vendor-cleaner 后,我的项目部署流程发生了质的飞跃:
- 显著减小部署包体积:清理掉几百兆甚至上G的无用文件后,部署包的大小可以减少一半甚至更多,极大地节省了存储空间和网络传输带宽。
- 加速部署时间:文件传输量的减少直接带来了部署时间的缩短,尤其是在网络条件不佳或需要频繁部署的环境下,效果非常明显。
- 更纯净的生产环境:生产服务器上不再有与生产无关的测试、文档等文件,减少了潜在的安全风险和混乱。
- 自动化与可靠性:一旦配置完成,清理过程完全自动化,无需人工干预,避免了手动清理可能带来的错误和遗漏。
- 高度可定制:灵活的Glob模式和排除规则,让我可以根据每个项目的具体需求,精确控制清理范围,确保不会误删任何必要文件。
- 与CI/CD无缝集成:在自动化部署流程中,这个插件能完美融入,成为部署流水线中不可或缺的一环。
如果你也曾被臃肿的 vendor 目录困扰,那么 liborm85/composer-vendor-cleaner 绝对值得一试。它不仅能让你的项目更轻盈,还能让你的部署工作变得前所未有的顺畅和高效。赶快尝试一下,让你的PHP项目焕发新生吧!