离线机PATH必须同时包含项目vendor/bin(或自定义bin-dir)和全局bin-dir(如~/.config/composer/vendor/bin),缺一不可;否则命令找不到或仍尝试联网。

离线开发时,Composer 本身不自动改 PATH,你必须手动告诉系统“去哪找缓存 ZIP 和可执行文件”——否则它会尝试联网下载或报 command not found。
离线机上 PATH 要加哪几个目录?
离线环境需要两处 PATH 配置,缺一不可:
-
vendor/bin或你自定义的bin-dir(如bin),用于运行 phpunit、psalm 等依赖包命令 -
composer global config bin-dir --absolute输出的路径(如/home/user/.config/composer/vendor/bin),用于运行laravel、psysh这类全局安装的工具
注意:这两者是独立的。项目命令和全局命令不共享同一目录,PATH 必须同时包含两者才完整。
为什么 export PATH="./bin:$PATH" 在离线机上可能失效?
常见原因不是配置错,而是执行位置或 shell 环境不匹配:
- 你在项目子目录下执行了
export PATH="./bin:$PATH",但./bin是相对当前路径的,实际应为../bin或用绝对路径 - IDE(如 PHPStorm)启动时没读你的
~/.zshrc,得在 IDE 设置 → Terminal → Environment variables 里单独加PATH - CI/CD 脚本(如 GitHub Actions)默认不加载用户 shell 配置,必须显式写
export PATH="$(pwd)/bin:$PATH"或直接调用vendor/bin/phpunit
cache-files-dir 设对了,PATH 也加了,还是重下 ZIP?
根本问题往往不在 PATH,而在 Composer 是否真读到了缓存文件:
- 运行
composer diag,确认Cache files directory行显示的是你复制过去的完整路径,且末尾含/files(例如/offline-cache/files,不是/offline-cache) - 检查该路径下是否存在类似
monolog/monolog/2.10.0.0/monolog-monolog-6a8c4b5.zip的 ZIP 文件;不存在说明缓存没拷全,或在线机当时没走这个路径 - Linux/macOS 上,确保 PHP 进程用户(如
www-data或你当前用户)有权限stat()该目录;Windows 上若挂载为只读(如 Docker:ro),Composer 会静默跳过读取
真正卡住离线流程的,往往是 cache-files-dir 路径少了个 /files,或者 vendor/bin 加进了 PATH 却忘了加全局 bin 目录——这两个点一旦漏掉,就等于没配。


















