直接用 composer install --no-install 无法生成可离线使用的包目录,因为该参数不存在且默认不保留原始压缩包;必须通过 composer archive 或手动下载 dist.url 对应的 .zip/.tar.gz 文件,并配合本地仓库(如 satis)或 repositories 配置 file:// 绝对路径才能实现离线安装。

为什么直接用 composer install --no-install 无法生成可离线使用的包目录
因为 composer install 默认只解压包、不保留原始压缩包,且 --no-install 实际并不存在(常见误用)。真正要离线携带,必须拿到每个包的原始 .zip 或 .tar.gz 文件,以及完整的 composer.lock 和元数据。否则换环境执行 composer install 时会报 Package not found 或 Could not fetch。
如何用 composer archive + 中文镜像批量下载原始包
核心是让 Composer 下载源码包(不是解压后的内容),同时确保走国内镜像。需先配置镜像,再逐个包调用 archive —— 但手动太慢,推荐脚本化处理:
- 运行
composer config -g repo.packagist composer https://packagist.phpcomposer.com(旧版镜像)或https://packagist.laravel-china.com(新版,注意部分包已迁至https://packagist.org镜像) - 解析
composer.lock中的packages和packages-dev,提取每个包的name、version、dist.url - 对每个
dist.url,用wget或curl -L下载(注意 URL 可能含 token,需保留 query 参数) - 下载后统一存入
offline-packages/目录,文件名建议用vendor_name-package_name-version.zip格式,避免重名
离线安装时怎么让 Composer 找到 U 盘里的包
不能只靠 composer install,必须启用本地仓库模式。关键在 composer.json 的 repositories 配置:
{
"repositories": [
{
"type": "package",
"package": {
"name": "monolog/monolog",
"version": "2.9.2",
"dist": {
"url": "file:///mnt/usb/offline-packages/monolog-monolog-2.9.2.zip",
"type": "zip"
}
}
}
]
}
但手动写几十个包不现实。更可行的是:用 composer-satis 在 U 盘根目录建一个最小私有仓库(只需 satis.json + 下载好的包),然后把 repositories 指向 file:///mnt/usb/satis/web/。注意路径必须是绝对路径,Linux/macOS 用 file://,Windows 用 file:///D:/satis/web/(三斜杠)。
立即学习“PHP免费学习笔记(深入)”;
Windows 下挂载 U 盘后路径识别失败的典型表现
常见错误是 file://D:\satis\web 不生效,报 Repository type "composer" does not support loading from local paths。这是因为 Composer 要求 file:// 协议必须用正斜杠且开头带三个斜杠:file:///D:/satis/web。另外,U 盘盘符可能变动(比如从 D: 变成 E:),所以实际使用时建议在脚本中动态检测盘符,或改用相对路径配合 composer config --global repos.0.type path + repos.0.url ./satis/web(仅限当前项目目录下存在该路径)。
同步完成后,U 盘里至少要有:完整 composer.lock、satis/web/(含 packages.json)、所有 .zip 包文件、以及一份说明文档标注 PHP 版本要求和 composer install 执行命令。漏掉 packages.json 就等于没仓库,这点最容易被忽略。



















