离线安装本地包必须用path仓库类型并设COMPOSER_DISABLE_NETWORK=1,否则require会联网失败;需确保包含合法composer.json、声明path仓库、加@dev标识、禁用packagist、执行dump-autoload -o。

离线安装本地包必须用 path 仓库类型,不能靠 composer require
离线时 composer require 会直接报错或卡住,因为它默认要联网查包名、版本、依赖树。唯一可行路径是把本地目录当仓库用,靠 path 类型跳过所有元数据请求。
关键前提:目标包根目录下必须有合法 composer.json,含完整 name(如 "acme/utils")和明确 version(如 "1.2.0")或分支标识(如 "dev-main")。
- 包目录建议放在项目内可移植位置,例如
./packages/my-utils,避免绝对路径 -
composer.json中必须加"options": {"symlink": false},否则离线机软链失效 - 项目
composer.json的repositories段要显式声明:{"type": "path", "url": "./packages/my-utils"} - 执行
composer require acme/utils:@dev,注意必须带@dev,否则不识别
COMPOSER_DISABLE_NETWORK=1 是硬性前置,否则 path 也会 fallback 到 Packagist
很多人以为只要写了 path 就自动离线,结果仍报 Could not fetch https://repo.packagist.org/packages.json——这是因为 Composer 默认仍会尝试 fallback 校验远程源,除非你彻底切断网络通路。
- Linux/macOS:前置写法,
COMPOSER_DISABLE_NETWORK=1 composer require acme/utils:@dev - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer require acme/utils:@dev - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer require acme/utils:@dev - 必须同步禁用全局 Packagist:
composer config --global repo.packagist false - 检查项目级配置:
composer config repo.packagist输出应为空,不能是composer https://packagist.org
安装后必须立即运行 composer dump-autoload -o
即使 path 包已解压进 vendor/,默认 autoload 不会自动包含它,尤其当包用了 PSR-4 自动加载规则时。不执行这步,运行时大概率报 Class not found。
-
-o参数强制生成优化版映射,比默认的散列文件更稳定 - 如果项目已有大量包,建议加
--no-dev避免加载 dev-only 类 - 验证是否生效:在项目中
require 'vendor/autoload.php'; var_dump(class_exists('Acme\Utils\Helper'));
常见失败点:锁文件里混了 "source": {"type": "git"} 条目
如果你是从 Git 分支开发的本地包,并用 composer require acme/utils:dev-main 引入,composer.lock 可能记录为 "source": {"type": "git", ...}。这种结构天生不支持离线——COMPOSER_DISABLE_NETWORK=1 下 install 会直接退出,不是报错,而是静默失败。
- 解决办法:改用
@dev+path仓库后,删掉composer.lock重生成 - 确认锁文件干净:
grep -A5 '"acme/utils"' composer.lock | grep source应无输出 - 若已存在含 git source 的 lock,不要试图手动改,直接清空
vendor/和composer.lock,再走一遍 path 流程
path 本身不保安全,COMPOSER_DISABLE_NETWORK=1 才是开关;而 composer.lock 里任何 source.type: git 或残留的 repo.packagist 配置,都会让整个流程在最后一刻崩掉。


















