--no-install 是为了跳过依赖安装阶段,即仅解包项目骨架、生成 autoload.php 骨架,但完全不读取或安装 require 和 require-dev 中的任何依赖,适用于需先定制 composer.json 再手动安装的场景。

create-project 用 --no-install 是为了跳过依赖安装阶段
当你执行 composer create-project 时,默认会自动运行 composer install 安装 composer.json 中声明的所有依赖。加上 --no-install,Composer 只解包项目骨架、复制文件、生成 vendor/autoload.php 骨架,但**完全不读取或安装任何依赖**——包括 require 和 require-dev 里的包。
这在定制项目模板(比如公司内部的 Laravel/ Symfony 骨架)时很关键:你可能想先修改 composer.json(删掉不需要的 dev 包、换镜像源、调整 PHP 版本约束),再手动运行 composer install,避免默认安装一堆暂时用不到或与当前环境冲突的包。
--no-install 和 --no-scripts 不是一回事
--no-install 只控制「是否执行依赖安装」,不影响其他生命周期脚本;而 --no-scripts 是禁用所有 scripts(如 post-root-package-install)。两者可共存,但目的不同:
- 如果你的骨架里定义了
post-create-project-cmd,它仍会执行(除非你额外加--no-scripts) -
--no-install后,vendor/目录是空的,autoload.php存在但不可用——别急着跑php artisan或bin/console - 某些骨架(如 Laravel)的
post-create-project-cmd会尝试生成.env或清缓存,这些操作若依赖未安装的包,就会报错——这时就得配合--no-scripts
典型使用流程:改完 composer.json 再 install
假设你从私有 Git 仓库拉一个定制骨架:
composer create-project myorg/laravel-starter myapp --no-install --repository-url=https://packages.myorg.com
接着手动编辑 myapp/composer.json:
- 删掉
phpunit/phpunit(CI 环境才需要) - 把
"laravel/framework": "^11.0"改成"^11.2"(锁定小版本) - 添加国内镜像配置:
"repositories": [{"type": "composer", "url": "https://packagist.phpcomposer.com"}]
最后显式安装:
cd myapp composer install --optimize-autoloader
容易忽略的副作用:autoload 生成不完整
--no-install 下,Composer 不解析依赖,因此不会生成完整的 vendor/composer/autoload_*.php 文件。即使你之后只改了 composer.json 的 autoload 段(如 PSR-4 映射),直接运行 composer dump-autoload 也不足以补全——必须等 composer install 或 composer update 触发完整 autoload 重建。
所以别指望 --no-install 后能立刻用上自定义命名空间自动加载;得走完一次正式安装流程。










