CI 3.x 不支持 Composer 安装框架本身,需手动下载;CI 4.x 必须用 composer create-project codeigniter4/appstarter 初始化,require 无效,入口必须是 public/index.php,.env 和 public/index.php 不会被 composer install/update 覆盖。

composer install 时提示 “package not found” 或 “no matching package found”
CodeIgniter 官方从 4.x 开始才正式支持 Composer 原生安装,CI 3.x 不是 Composer 原生项目,composer require codeigniter/framework 会失败——因为 Packagist 上根本没有这个包。CI 4.x 才有 codeigniter4/framework。
- CI 3.x:必须用下载 ZIP 或 Git 克隆方式部署,
composer install仅用于安装其可选依赖(如paragonie/random_compat),不是框架本身 - CI 4.x:运行
composer create-project codeigniter4/appstarter project-name是唯一推荐的初始化方式;直接composer require codeigniter4/framework会出错,因为它不能被“require”进已有项目(缺少 autoloader 配置和核心引导结构) - 常见误操作:在空目录下执行
composer init再require,结果得到一个没入口、没public/index.php、无法响应 HTTP 请求的“半截框架”
CI 4.x 的 vendor/autoload.php 为什么不能直接 require 到 index.php?
CI 4.x 的启动流程强依赖 app/Config/Autoload.php 和 system/bootstrap.php,它不靠 Composer 的自动加载兜底整个框架逻辑。硬塞 require __DIR__.'/vendor/autoload.php'; 进去,会导致 Services、Events、Config 等核心服务未初始化就报错,比如 Call to undefined function CodeIgniterconfig()。
- 正确入口永远是
public/index.php,它内部已包含完整 bootstrap 流程 - 如果你在 CLI 下写脚本想复用 CI 4 的类,应该用
php spark命令或继承CodeIgniterCLIBaseCommand,而不是手动引入 autoload - 修改
composer.json的autoload字段只影响你自己的类,不影响框架行为;加了"psr-4": {"App\": "app/"}没问题,但别动"files"或试图覆盖system/
部署到生产环境时,为什么 vendor 目录体积大且部分文件冗余?
composer install --no-dev 能删掉 phpunit、fakerphp/faker 这类开发依赖,但 CI 4.x 的 system/ 核心代码不在 vendor 里——它被 appstarter 作为骨架复制进项目了。真正藏坑的是 vendor/codeigniter4/framework 这个包本身:它只是个“占位符”,实际框架代码由 appstarter 提供,所以你看到的 vendor 里那个 framework 包几乎为空。
- 不要手动删
vendor/codeigniter4/framework,否则spark命令会找不到命令定义 - CI 4.4+ 默认启用
opcache.preload支持,但 preload 脚本需显式列出所有要预加载的文件,vendor/autoload.php不够用;得用spark optimize:preload生成 - Git 部署时记得把
.env加入.gitignore,但app/Config/下的默认配置(如App.php)必须提交——它们不是敏感信息,而是框架运行必需的骨架
怎么让 CI 4.x 的 composer 自动更新后不覆盖 public/index.php 或 .env?
答案是它根本不会覆盖——composer update 只改 vendor/ 和 composer.lock,public/index.php 是项目骨架的一部分,由 appstarter 初始化时写入,后续 Composer 操作完全不碰它。真正危险的是人手贱执行 composer create-project ... --force 覆盖整个目录,或者用错误的 Git 工作流把本地 .env 提交到了仓库。
-
.env必须由运维在部署时生成或注入,CI/CD 流水线里用echo "APP_ENV = production" > .env类似操作,而不是从模板复制 - 如果用了
composer install --no-interaction,确保COMPOSER_NO_INTERACTION=1环境变量已设,否则某些插件可能卡住等待输入 - 升级 CI 小版本(如 4.4.3 → 4.4.4)时,检查
appstarter的 CHANGELOG,有时它会带新public/index.php补丁——这时需要人工比对并合并改动,不是 Composer 自动处理的










