--no-install 仅跳过 composer install,但仍执行 post-create-project-cmd 脚本;若脚本依赖未安装的 vendor(如 php artisan key:generate),会报错;需加 --no-scripts 彻底禁用。

为什么 composer create-project --no-install 有时根本没用
这个命令看似能跳过依赖安装,实际却常被忽略一个关键点:它只跳过 composer install 阶段,但**仍会执行项目仓库的 post-create-project-cmd 脚本**。如果目标项目的 composer.json 里定义了该脚本(比如自动运行 npm install 或 php artisan key:generate),这些操作照常发生,甚至可能因缺少 vendor 文件而报错。
常见错误现象:Script php artisan key:generate handling the post-create-project-cmd event returned with error code 1
- 确认目标项目是否含
"post-create-project-cmd"字段(查看其composer.json) - 若需彻底跳过所有脚本,加
--no-scripts参数:composer create-project --no-install --no-scripts - 某些旧版 Composer(--no-install,会静默忽略;建议升级到 2.x 或至少 1.10+
create-project 的 --no-install 和直接 git clone + composer install --no-dev 有什么区别
核心差异在于「项目初始化完整性」:前者会按 composer.json 中的 autoload、scripts、config 等字段生成基础结构,并写入 vendor/autoload.php(空文件),后者则完全从零开始。
-
create-project --no-install会创建vendor/目录和空的autoload.php,但不会下载任何包 - 直接
git clone后composer install --no-dev会完整解析依赖、生成自动加载映射、执行脚本(除非显式禁用) - 如果你只想快速拉下代码结构、后续再统一处理依赖(例如离线环境、CI 分阶段构建),
--no-install更轻量;但若要复现生产环境行为,后者更可控
什么时候必须用 --no-install,而不是删掉 vendor 再装
典型场景是「模板项目初始化」或「CI 构建缓存优化」:你希望保留原始 composer.lock 的约束,但跳过耗时的依赖下载与解压,等后续在特定环境里再执行 install。
- CI 中配合缓存:先
create-project --no-install拉下代码骨架,再用缓存的vendor/目录覆盖(避免重复下载) - 本地开发中想检查
composer.json是否合法、或测试自定义脚本逻辑,又不想污染当前vendor - 注意:
--no-install不会校验composer.lock与composer.json是否一致;若两者冲突,后续install仍会失败
--no-install 后手动 composer install 失败怎么办
最常见原因是 PHP 版本或扩展缺失导致依赖无法解析,而非命令本身问题。Composer 在 create-project 阶段不校验环境兼容性,直到真正 install 才触发。
- 运行
composer install -v查看详细报错,重点关注Your requirements could not be resolved类提示 - 检查当前 PHP 版本是否满足
composer.json中"php": "^8.1"这类约束(用php -v确认) - 确认已启用必要扩展,如
mbstring、xml、curl(php -m | grep -E "(mbstring|xml|curl)") - 若项目使用了平台配置(
config.platform),确保它与当前环境匹配,否则可能导致依赖解析异常
真正容易被忽略的是:这个命令不是“跳过安装”,而是“推迟安装”——它把校验和下载的时机往后挪了,但所有约束条件一个都不会少。










