离线环境post-install-cmd不执行主因是Composer默认跳过脚本,需显式启用或改用composer run-script调用;关键前提是禁用全局repo.packagist、清除网络依赖,并在install后手动执行dump-autoload -o和缓存清理。

离线环境里 post-install-cmd 根本不执行
不是脚本写错了,而是 Composer 默认在离线或生产部署时跳过所有 scripts。即使 composer.json 里明确定义了 post-install-cmd,只要没显式启用,它就静默忽略——尤其当 COMPOSER_DISABLE_NETWORK=1 或用了 --no-scripts(后者常被误加进部署命令)。
实操建议:
- 检查部署命令是否含
--no-scripts:有则必须去掉;若为安全考虑需保留,就把关键逻辑拆成独立脚本名(如deploy:setup),再用composer run-script deploy:setup --no-dev显式调用 -
post-install-cmd只在composer install成功后触发,但前提是vendor/是空的或刚清空过;若vendor/已存在且composer.lock未变,Composer 可能直接跳过 install 阶段,也就不会触发事件 - 确保
scripts字段在composer.json根层级,不在extra或其他嵌套对象里
离线运行脚本时权限和路径经常崩
脚本执行时的当前目录是项目根,但用户权限、PATH、PHP CLI 配置可能和 Web 进程不一致。常见现象:本地能跑通的 php artisan cache:clear,上线后报 Permission denied 或 command not found。
实操建议:
- 避免裸写
php artisan,改用php ./artisan或php -d memory_limit=-1 ./artisan,防止 CLI ini 覆盖 - 操作文件时用
${PWD}/storage替代storage/,避免因工作目录意外变更导致路径错位 - 不要在脚本里硬编码用户(如
chown www-data:www-data),改用id -u和id -g动态获取当前 UID/GID
怎么让离线部署自动完成 autoload + 缓存清理
离线时不能依赖 composer install 自动重建 autoload,也不能指望 post-install-cmd 帮你清缓存——这两步都得手动串起来,且顺序不能错。
实操建议:
- 先跑
composer install --no-plugins --no-scripts --no-autoloader --no-dev --optimize-autoloader,跳过所有联网与副作用环节 - 立刻补一记
composer dump-autoload -o,否则运行时必报Class not found - 再单独执行清理命令:
php ./artisan config:clear && php ./artisan cache:clear,别塞进post-install-cmd里——离线时它大概率不触发 - 如果用的是 Laravel,
view:cache必须在config:clear后执行,否则会缓存旧配置
全局 repo.packagist 配置会偷偷联网校验
即使设了 COMPOSER_DISABLE_NETWORK=1,只要全局配置里还留着 repo.packagist(比如之前运行过 composer config --global repo.packagist https://packagist.org),Composer 在离线 install 时仍会尝试 fallback 校验,直接报错退出。
实操建议:
- 离线机首次使用前,务必运行
composer config --global repo.packagist false彻底禁用 - 检查是否残留:运行
composer config --global --list | grep repo.packagist,确认输出为repo.packagist=false - 项目级配置中也别写
"repositories": [{"type": "packagist", "url": false}]——COMPOSER_DISABLE_NETWORK=1下它会导致直接退出,不是静默忽略
COMPOSER_DISABLE_NETWORK=1 和 repo.packagist=false 这两个开关没关死,或者 composer install 后忘了 dump-autoload -o。这两个动作漏一个,整个离线流程就算写对了脚本,也会在运行时崩。


















