本文基于 laravel/cpx 的 README.md 与 UPGRADE.md。内容对应 v2.0.0(发布于 2026 年 7 月 24 日)。
什么是 cpx
cpx 是一款可以在不安装的情况下执行 Composer 包所包含命令的工具。可以将其理解为 npm 中npx 的 Composer 版本。
为什么需要它
通过composer global require 单独安装工具的方式存在以下问题:
- 全局依赖之间可能相互冲突(尤其是使用
nikic/php-parser或symfony/console等公共依赖的工具容易出现) - 希望不同项目使用同一工具的不同版本
- 长期运行时容易忘记更新全局包
- 不希望为仅用一次的工具进行全局安装
v2.0 的全面重写
cpx 在 v2.0 中被全面重写,并作为自包含 PHAR分发。基本用法(cpx <package-name> <command> [arguments])与 ~/.cpx 缓存目录都保持不变。1.x 已冻结开发,包括 bug 修复和安全修复在内今后不会再有版本发布。
升级只需重新执行全局安装。
v2.0 的新功能
本地二进制优先执行
与 npx 类似,如果项目中已经安装了对应的二进制,则会优先执行它,而不是安装隔离副本。cpx 会从当前目录向上查找最近的 Composer 项目,并执行vendor/bin(默认的 bin-dir)中匹配的二进制。
--skip-local。
直接执行本地包目录
可以直接指定开发中的 Composer 包目录,执行其二进制。composer.json,且依赖需事先安装到 vendor/autoload.php。此时 cpx 不会执行 Composer,也不会复制或缓存包。
cpx exec 与 cpx tinker
提供了多种快速执行 PHP 代码的方式。
在 Laravel 项目内,
cpx exec 会完整启动应用程序,包括 config、facade、.env($app 可用),cpx tinker 会执行项目自身的 php artisan tinker(若已安装 laravel/tinker)。在其他位置则会启动 PsySH shell。
在脚本中可通过 cpx_require('vendor/package')(1.x 中的 composer_require() 已改名)现场加载包。
别名功能
可以定义自己的快捷方式,避免记忆冗长的包名。非交互模式与 JSON 输出
cpx 会通过 laravel/agent-detector 检测 AI 智能体,并从标准输入重定向、--no-interaction/-n 标志自动检测非交互环境。在非交互模式下,installed、aliases、alias、unalias、clean、update 等 cpx 自身的管理命令会返回一行 JSON 而非格式化文本。即便是交互式终端,也可以通过 --json 获得相同的输出。
从 v1.x 的主要变化(命令)
相关页面
~/.cpx 目录的缓存和旧版本包会自动迁移到新格式,但带版本约束执行的包由于以新目录名管理,因此仅首次会重新安装。不再需要的 1.x 时代的副本可以通过 cpx clean 删除。
laravel/cpx 仓库
源代码和最新的 README 请见此处。
cpx 2.0 升级指南
从 1.x 到 2.x 的详细迁移步骤。