离线环境下require-dev依赖必须提前在联网机全量构建并迁移,不可动态拉取;需确保zip包、autoload映射、cache-files-dir(末尾带/files)及lock文件中dist字段含url与shasum,离线机仅执行composer install --no-dev后补dump-autoload -o。

离线办公环境下,require-dev 依赖不能靠 composer install --dev 动态拉取——它会立刻报 Could not fetch https://repo.packagist.org/packages.json。必须提前在联网机完成全量构建,并确保 dev 包的 ZIP 文件、autoload 映射、配置开关全部就位。
离线机上不能运行 composer require --dev
这个命令本质是联网解析包元数据 + 下载 + 更新 lock 文件,三步全卡在第一步。即使你设了 COMPOSER_DISABLE_NETWORK=1,它仍会尝试读远程仓库索引,直接失败。离线时所有 require-dev 的增删改都必须在联网机完成,再整体迁移。
- 联网机执行:
composer require --dev phpunit/phpunit:^10 --no-autoloader --no-scripts --no-plugins - 接着跑一次:
composer install --no-dev --prefer-dist(先确保 prod 环境干净) - 再跑:
composer install --dev --prefer-dist --no-scripts --no-plugins(只装 dev 包,且强制走 ZIP 缓存) - 最后:
composer dump-autoload -o,生成含 dev 类映射的优化 autoloader
cache-files-dir 必须显式指向 /path/files,不是 /path
离线复用 require-dev 的前提是 ZIP 包真被写进缓存并能被读到。cache-dir 只是父目录,真正起作用的是 cache-files-dir,而且 Composer 要求它末尾必须带 /files —— 否则静默 fallback 到默认路径,而那个路径在离线机上基本为空。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 联网机清旧配置:
composer config --global --unset cache-dir - 设有效路径:
composer config --global cache-files-dir /opt/composer-cache/files - 验证是否生效:
composer diag | grep "Cache files directory",输出必须和你设的一致 - 检查 ZIP 是否真落盘:
ls /opt/composer-cache/files/phpunit/phpunit/10.5.10.0/应见phpunit-phpunit-*.zip
离线安装时必须加 --no-dev,但开发机要保留完整 autoload
很多人误以为离线部署只要跳过 dev 包就行,结果本地跑测试时 class_exists('PHPUnitFrameworkTestCase') 报错。根本原因是:用了 --no-dev 后,vendor/autoload.php 不再加载 autoload-dev 规则,但你的测试代码又依赖它。
- 正确做法:离线机部署用
COMPOSER_DISABLE_NETWORK=1 composer install --no-dev --no-plugins --no-scripts --no-autoloader - 但必须紧接着补:
composer dump-autoload -o(这步生成的 autoloader 是不含 dev 类的) - 开发机保持
composer install(不加--no-dev),确保vendor/autoload.php支持测试类加载 - 若项目有
"autoload-dev": {"psr-4": {"Tests\": "tests/"}},离线机不装 dev 包时,Tests命名空间不会注册——别在生产代码里硬引用Tests下的类
别信 config.platform 能绕过离线限制
config.platform 只影响依赖解析阶段的版本兼容性判断,比如防止装 PHP 8.2-only 的包。但它不阻止 Composer 尝试联网查包是否存在、校验签名、下载 ZIP。在离线场景下,它完全不解决核心问题。
- 如果你看到
Package phpunit/phpunit is not available in the configured repositories,说明repo.packagist false没生效,或COMPOSER_DISABLE_NETWORK=1没设对 - Windows 用户注意:
set COMPOSER_DISABLE_NETWORK=1只对当前 CMD 窗口有效;PowerShell 用$env:COMPOSER_DISABLE_NETWORK="1" - 最稳验证方式:进容器后先
ip link set eth0 down,再跑composer install --no-dev --no-plugins,不报任何https://错误才算真离线
最容易被忽略的点是:离线机上的 composer.lock 必须由联网机制作,且其中所有包的 "dist" 字段必须含 "url" 和 "shasum",不能是 "type": "git" 或 "reference" —— 否则离线时 Composer 会试图 clone,而不是解压 ZIP。










