上线执行 composer install后,自定义支付或ERP模块整个目录不见了。原因通常很直接:代码被手工复制到vendor,却没有出现在composer.lock中。vendor是依赖安装结果,不是源码仓库,Composer有权替换或清理它。

先确认丢失模块的来源

composer show vendor/package -a
grep -R '"Vendor_Module"' composer.json composer.lock app/etc/config.php
git ls-files vendor/vendor/package app/code/Vendor/Module

如果composer show找不到、Git也没跟踪,当前部署方式无法可靠重建。先从可信备份或原始仓库恢复代码并核对哈希,不要从运行中服务器随意打包未知版本。

两条正确迁移路径

内部项目模块放app/code

把模块迁到 app/code/Vendor/Module,确保registration.php、module.xml和composer.json命名空间正确。提交到项目仓库后执行:

bin/magento module:enable Vendor_Module
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush

可复用模块做Composer包

将模块放独立私有仓库,composer.json设置type为magento2-module,并通过composer/installers安装。生产构建使用固定tag或commit,更新composer.lock;私有仓库凭据放在部署密钥或安全的auth配置中,不提交到代码库。

迁移前后注意

  • 保持模块名和setup patch标识不变,避免数据库重复升级;
  • 比较etc、Plugin、Observer与cron配置是否完整;
  • 保存原模块版本号和第三方许可证;
  • 不要同时保留app/code与vendor两份相同模块;
  • CI中用全新目录跑composer install,验证构建可重现。
紧急恢复时可以暂时还原文件让网站运行,但随后必须完成源码归档和正式依赖管理,否则下一次部署还会再次消失。