离线源需禁用 packagist.org 并配置镜像,satis 需手动补全依赖、生成 packages.json,platform 配置避免扩展检测失败,私有包须用唯一命名空间防 autoload 冲突。

composer install 时还在连 packagist.org?说明没配离线源
离线源本质是把 packagist.org 的元数据镜像到本地或内网服务器,让 composer install 不依赖外网。不是简单改个 repositories 就能生效——Composer 默认仍会 fallback 到官方源,除非显式禁用。
- 必须在
composer.json中设置"packagist.org": false(注意 key 是字符串,不是布尔值) - 推荐用
composer config --global repo.packagist composer https://your-mirror.com全局配置,比每次改项目文件更可靠 - 如果镜像服务用的是私有 Satis 或 Private Packagist,确保其
packages.json已生成且可被 HTTP 访问,否则会报Could not parse version constraint
用 satis 搭建离线源,最常卡在 packages.json 生成失败
satis build 不是“一键同步”,它只按 satis.json 里写的 require 列表拉包,不会自动抓取依赖树全量包。漏写一个依赖,composer install 就会退回到联网找包。
-
satis.json中的"require-all": true仅对指定仓库生效,不等于“同步所有 packagist 包” - 建议先用
composer depends --tree vendor/package-name手动理清依赖链,再写进satis.json的require - 生成后检查输出目录下是否有
packages.json和include/all$xxx.json,缺任意一个,Composer 都会报file could not be downloaded
离线模式下 require-dev 依然触发联网?因为没关掉 platform config
即使源已离线,composer install --no-dev 仍可能报错说找不到 ext-redis 或 php ^8.1 —— 这是 Composer 在校验平台扩展时默认查系统,但某些内网环境 PHP 模块名和版本号无法被自动识别。
在线订餐系统源码,提供给设计人员参考一个小型的在线订餐管理系统源码,采用三层模式开发,代码注释详细前台可以进行用户注册、菜单管理及订餐后台管理员可以进行菜单管理、新闻管理、菜肴管理、用户管理操作数据库采用的是Sql2005(由于数据库在App_Data下,如果装了Sql2005数据库会自动配置)
- 加
"platform": {"php": "8.1.0", "ext-redis": "5.3.7"}到composer.json,强制跳过运行时检测 - 避免用
composer install --ignore-platform-reqs,它会掩盖真实缺失的扩展,上线后直接崩 - 若用 Docker,确保 base image 的 PHP 版本和扩展与
platform声明完全一致,小版本号差一位都可能触发 fallback
私有包 + 离线源混用,autoload 冲突比想象中多
当项目同时 require 私有 Git 包和离线镜像里的公共包时,Composer 会优先走 repositories 顺序。如果私有包的 composer.json 里写了 "autoload": {"psr-4": {"App\": "src/"}},而离线源里某个包也用了 App\ 命名空间,composer dump-autoload 就会报重复声明。
- 私有包务必用唯一命名空间,比如
YourCompany\YourProject\,别图省事用App\或Common\ - 离线源同步前,用
composer show vendor/package --no-ansi | grep autoload扫一遍目标包是否污染命名空间 - 运行
composer install -vvv查看实际加载了哪些autoload.php,比猜快得多
离线源真正难的不是搭起来,而是让所有参与构建的人——包括 CI 脚本、新同事、甚至你三个月后的自己——都不自觉地绕过官方源。只要有一处没关严,就会在深夜部署时突然连不上 packagist.org。









