应仅备份composer.json和composer.lock:前者声明依赖需求,后者锁定精确版本与哈希值;vendor目录可由composer install重建,无需备份。

如何用 shell 脚本备份 Composer 的 composer.json 和 composer.lock
直接备份这两个文件就足够还原依赖元数据——composer.json 定义了项目需求,composer.lock 锁定了精确版本和哈希值。不备份 vendor 目录,它可由 composer install 重建。
实操建议:
- 脚本应先检查当前目录是否存在
composer.json,避免误操作空目录 - 用
date +%Y%m%d_%H%M生成时间戳,避免覆盖(例如:backup_20241015_1423.tar.gz) - 压缩时加
--dereference防止符号链接被存为指针(尤其当vendor是 symlink 时) - 推荐用
tar -czf而非zip:保留 Unix 权限且更轻量
为什么不能只备份 composer.json?
composer.lock 不是冗余文件。没有它,composer install 会退化为 composer update 行为——即按 composer.json 中的版本约束重新解析最新兼容版本,极易引入意外变更(比如 minor 版本升级导致 BC break)。
常见错误现象:
- CI 环境反复构建结果不一致
- 本地
composer install后vendor/内容与测试环境不同 -
git status显示composer.lock被修改,但没人动过它(其实是 lock 文件缺失后自动生成)
自动备份脚本怎么加到 cron 并避免冲突?
在 crontab 里直接调用 tar 可能撞上正在运行的 composer update,导致 composer.lock 写入一半就被打包。
安全做法:
- 用
fuser -s composer.lock 2>/dev/null检查文件是否正被占用,超时 3 秒则跳过本次备份 - cron 命令末尾加
> /dev/null 2>&1,避免邮件轰炸 - 设置
cd /path/to/project && /path/to/backup.sh,绝对路径 + 显式切换目录,防止 cron 执行时 pwd 错乱 - 备份目录单独挂载或配磁盘配额,防止
.tar.gz堆满根分区
要不要备份 ~/.composer/auth.json 或全局配置?
一般不用。该文件含私库认证凭据(如 GitHub token、私有 Packagist 密钥),属于敏感信息,不应随项目元数据一起备份或提交。若需迁移开发环境,应单独、加密导出,并通过 composer config --global 重置。
真正要关注的是:
- 项目级
auth.json(位于项目根目录)——它受.gitignore影响,常被忽略,但若项目依赖私有包,必须备份 -
composer.json中的repositories字段——定义了私有源地址,丢失会导致composer install报Could not find package
复杂点在于权限和上下文隔离:一个脚本跑在 CI、另一个跑在本地,auth.json 的存在位置和读取优先级(项目级 > 全局级 > 环境变量)容易被忽略。


















