composer install --no-install是预下载的唯一合法方式,它解析lock文件、校验哈希、下载dist包到缓存但跳过解压和autoload生成;必须配合--prefer-dist,且不可用--dry-run或composer update --no-install替代。

composer install --no-install 是预下载的唯一合法方式
Composer 没有“只下载不安装”的交互式开关,--no-install 是唯一被官方文档明确支持、且实际生效的预下载参数。它会让 Composer 完整解析 composer.lock,校验哈希,下载所有 dist 包(.zip/.tar.gz)到本地缓存目录,但跳过解压、生成 autoload、写入 vendor 等后续步骤。
常见错误是误用 --dry-run —— 它只模拟依赖解析,根本不触发下载;或试图用 composer update --no-install,但 update 会重算依赖树,破坏 lock 文件一致性,不能用于预下载场景。
-
--no-install必须配合--prefer-dist:否则 source 类型(如 git)包会被跳过,缓存里只有空壳 - 执行后检查
~/.composer/cache/files/下是否有对应包的 zip 文件(路径形如vendor/name/sha256-hash.zip) - 若项目含私有包,需提前在联网机配置好
repositories并认证,否则--no-install会直接报错退出
预下载后怎么确保离线机真能用?关键三步缺一不可
光有 zip 包不够。Composer 离线时要同时读取三类缓存文件:files/(包本体)、repo/(元数据映射)、archived/(归档索引)。少任何一类,它都会 fallback 到联网请求。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 打包时必须拷整个缓存根目录(例如
~/.composer/cache),不是只拷files/ - 离线机上先运行
composer config --global cache-dir /path/to/your/cachedir,让 Composer 认出你放的位置 - 执行前必须设环境变量
COMPOSER_DISABLE_NETWORK=1,否则即使缓存齐全,它也会尝试访问https://repo.packagist.org/packages.json
中文路径导致预下载失败?问题不在包名,在缓存目录
报错 failed to open stream: No such file or directory 十有八九是因为缓存路径含中文字符(如 /home/张三/.composer/cache)。Composer 内部拼接 file:///home/张三/... URI 时未做 URL 编码,Linux/macOS 直接拒绝解析。
- 预下载前,在联网机强制改缓存路径为纯英文:
composer config --global cache-dir /tmp/composer-cache - 离线机解压后,同样用
composer config --global cache-dir指向该英文路径 - 别信“只要包名是英文就行”——
composer.json里写"name": "vendor/中文包"完全合法,真正卡住的是本地文件系统路径
为什么 --no-plugins --no-scripts 在预下载阶段反而有害?
--no-plugins 和 --no-scripts 在离线安装时是救命参数,但在预下载阶段加它们,可能让某些插件无法完成必要的元数据准备,导致缓存不完整。
典型例子:私有插件包带 post-update-cmd 脚本,负责生成仓库索引 JSON;如果预下载时禁用脚本,repo/ 目录下就缺关键文件,离线时 COMPOSER_DISABLE_NETWORK=1 也救不回来。
- 预下载阶段应保持默认行为(不加
--no-plugins、--no-scripts),让插件和脚本能跑完 - 离线安装阶段才加
--no-plugins --no-scripts --no-dev --optimize-autoloader,切断所有外部依赖 - 若插件本身会联网(如 hirak/prestissimo),需在预下载机提前禁用:
composer config --global disable-tls false不起作用,得删插件或换镜像源










