composer create-project在离线环境必然失败,因其设计强制联网请求https://repo.packagist.org/packages.json校验元数据,不读本地缓存、不认已有vendor/或composer.lock,设COMPOSER_DISABLE_NETWORK=1也无效;可靠方案是分步法:联网机准备骨架+composer install --no-dev --prefer-dist --no-scripts --no-plugins --optimize-autoloader生成完整vendor/,离线机执行COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader后必须运行composer dump-autoload -o。

离线环境下不能直接用 composer create-project,它一定会联网校验仓库元数据,必须分步构造:先有骨架 + 完整 vendor + 补全 autoload。
为什么 composer create-project 在离线环境必然失败
该命令内部会强制请求 https://repo.packagist.org/packages.json,哪怕你本地有缓存、有 composer.lock、甚至 vendor/ 目录已存在,也会卡在 “Loading composer repositories” 或报 Could not fetch 错误。这不是配置问题,是设计使然——它不走离线路径。
常见错误现象:
- 执行
composer create-project topthink/think myapp后长时间无响应 - 报错信息含
Failed to decode response或Connection refused - 即使设了
COMPOSER_DISABLE_NETWORK=1,仍提示 repository 不可用
离线初始化的可靠三步法
核心逻辑:绕过黑盒命令,用原子操作重建项目结构。前提是已在联网机器上准备好完整依赖。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在联网机上用
git clone或解压官方 ZIP 获取项目骨架(如topthink/think),删掉原composer.lock(防止锁住远程地址) - 进目录运行:
composer install --no-dev --prefer-dist --no-scripts --no-plugins --optimize-autoloader,确保vendor/完整且不含开发依赖 - 打包整个目录(含
vendor/、composer.lock、composer.json),拷入离线机
离线机上执行的关键命令与陷阱
离线机不是简单解压就能跑,必须切断所有隐式联网通路,并补全 autoload 映射。
- 先清全局缓存干扰:
composer config --global cache-dir /dev/null - 禁用网络并跳过高风险环节:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found - 若
composer.json中有"source"类型依赖(如"dev-master"或 Git URL),install 会直接失败,需提前替换为 dist 包或删掉
补充:如何在已有空目录里手动初始化(非骨架项目)
适用于想从零搭框架、或嵌入已有工程的场景,但不会生成 public/index.php、runtime/ 等骨架文件,需自行补全。
- 运行
composer init,注意Package name必须是全小写vendor/name格式(如local/myapp),含空格或大写会立即报错 - 交互中选 yes 配 autoload 时,只支持
classmap,不支持psr-4;要 PSR-4 必须手动编辑composer.json加:{"psr-4": {"App\": "src/"}},且src/目录必须真实存在 - 把已准备好的
vendor/目录直接复制进来,再运行composer dump-autoload --classmap-authoritative - 验证是否生效:
php -r "require 'vendor/autoload.php'; echo class_exists('App\Hello') ? 'ok' : 'fail';"
最易被忽略的一点:即使 vendor/ 和 composer.lock 完全一致,只要没执行 dump-autoload -o,类加载就不可靠;而 --classmap-authoritative 这个参数一旦漏掉,在大型项目里可能漏掉几十个类,排查成本远高于多打一个命令。

















