离线安装必须设COMPOSER_DISABLE_NETWORK=1,否则所有--no-xxx参数无效;即使vendor和composer.lock完整,也会因请求packages.json失败而报错。

离线安装必须设 COMPOSER_DISABLE_NETWORK=1
不设这个环境变量,所有 --no-plugins、--no-scripts 都无效。Composer 会在 install 阶段主动请求 packages.json 元数据,哪怕 vendor/ 和 composer.lock 完整,也会报 Could not fetch https://repo.packagist.org/packages.json。断网 ≠ 自动离线模式,这是最常被忽略的硬性前提。
生效方式有两种:
- 临时生效:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 全局生效(推荐):
composer config --global --unset repos.packagist && composer config --global repo.packagist false,再配合COMPOSER_DISABLE_NETWORK=1使用
注意:repo.packagist false 不是字符串 "false",而是 JSON false 值,运行 composer config -g repo.packagist 应输出 false,不是 "false" 或报错。
composer install 离线执行的最小安全参数组合
仅靠 COMPOSER_DISABLE_NETWORK=1 还不够——它只禁网络,但插件、脚本、autoload 重建仍可能触发隐式联网或路径污染。
必须用这组参数一次性跑通:
-
--no-plugins:跳过hirak/prestissimo、phpstan/extension-installer等插件初始化,它们可能尝试查 GitHub API -
--no-scripts:屏蔽post-install-cmd,防止执行npm install、生成前端资源或调用外部配置服务 -
--no-autoloader:避免重建 autoload 时读取vendor/composer/autoload_static.php外部路径(某些自定义 autoloader 实现会触发远程类查找)
执行完后立刻补一记:composer dump-autoload -o。否则运行时大概率报 Class not found——因为 --no-autoloader 跳过了这步,而离线环境没法靠 fallback 补救。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
离线新增包只能用 path 仓库,别碰 require
composer require monolog/monolog 在离线时必然失败:它默认要联网查包名是否存在、版本是否合法、依赖是否满足。没有替代命令,也没有“离线 mode”可切换。
唯一可靠方式是把本地目录当仓库用:
- 目标包根目录下必须有合法
composer.json,含完整"name"(如"acme/utils")和"version"(如"1.0.0")或分支标识(如"dev-main") - 项目根目录
composer.json中添加:"repositories": [{"type":"path","url":"./packages/my-utils"}](注意:url必须是相对路径;Windows 下需带盘符,如"C:/projects/my-pkg") - 然后运行
composer require acme/utils:dev-main——此时 Composer 不联网,只解析本地composer.json并软链接
不要试图用 artifact 仓库:它只支持顶层包,子依赖仍会去远程源找,离线必挂。
缓存打包方案里最容易漏掉的子依赖
用 ~/.composer/cache/files/ 打包离线依赖,看似稳妥,但常见失败是 “Package not found”,原因不是主包缺失,而是某个子依赖(比如 psr/log、symfony/polyfill-mbstring)根本没进缓存。
关键点在于:在线机必须执行完整安装,不能只 composer update monolog/monolog 或 composer require 主包。
- 正确做法:
composer install --no-dev --prefer-dist(确保所有 transitive dependencies 都被拉下来) - 验证是否拉全:
ls ~/.composer/cache/files/ | wc -l对比composer show --tree | wc -l,数量应基本一致 - 打包时必须包含整个
files/目录结构,不能只拷几个 ZIP;解压后目标机必须显式配置:composer config --global cache-files-dir /your/local/cache/path,否则 Composer 默认仍查原路径(可能为空)
真正难处理的,是 composer.lock 里标记为 "source" 类型的包(如 Git URL、"dev-master")。这类包离线时无法校验 commit hash,install 必然失败——你得提前在在线机把它转成 dist 形式:composer install --no-dev --prefer-dist 强制走 zip,再确认 lock 文件中对应项的 "dist" 字段存在且完整。

















