composer 本身不提供部署能力,仅是依赖管理器;所谓自动化部署实为通过 scripts 字段串联命令,并配合环境、权限与路径控制来模拟部署动作。

Composer 本身不提供“部署”能力,它只是依赖管理器;所谓“自动化部署”,本质是用 scripts 字段把一系列命令串起来,再配合环境、权限和路径控制来模拟部署动作。直接写 "deploy": "rsync ..." 很容易在生产环境出错,关键得知道哪些步骤必须拆开、哪些参数不能省。
composer.json 的 scripts 不是万能胶水
很多人把所有操作塞进一个 deploy 脚本里,结果一执行就卡在 php artisan migrate 或 rsync 权限拒绝上。scripts 是按顺序执行的 shell 命令列表,没有错误中断机制(除非你加 &&),也没有上下文隔离。
- 不要写
"deploy": "git pull && composer install && rsync ..."—— git 拉取失败时,后面仍会执行 - 敏感操作如数据库迁移,必须显式加
--force或前置检查,否则交互式提示会卡住 -
post-install-cmd和post-update-cmd在本地运行,不是服务器上自动触发的——别指望 push 代码后线上就自己跑缓存命令 - 脚本中调用的
php或artisan命令,路径必须明确,比如用./artisan而非php artisan,避免系统 PHP 版本不一致
怎么安全地组合 deploy:prepare / deploy:sync / deploy:activate
把部署拆成阶段,既能定位问题,也方便 CI/CD 分步调用。每个阶段只做一件事,失败即停。
-
deploy:prepare:拉代码 + 安装依赖 + 构建前端(npm run build)+ 清理临时文件 -
deploy:sync:用rsync -avz --delete --exclude=".git" ./ user@server:/path/同步,注意--delete会清空目标目录下未在源中出现的文件 -
deploy:activate:远程执行ssh user@server 'cd /path && php artisan config:cache && chown -R www-data:www-data storage/' - 所有 rsync 命令必须提前配置好 SSH 免密登录,否则会阻塞在密码提示
为什么 vendor 目录不该随 rsync 一起传
直接同步整个项目(含 vendor/)看似省事,但会带来三个实际问题:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不同服务器的扩展(如
ext-redis)或 PHP 版本差异,导致vendor/中某些类无法加载 -
vendor/体积大,rsync 传输慢且易中断;而composer install --no-dev --optimize-autoloader在目标机上执行更快、更可靠 - 如果用了
COMPOSER_VENDOR_DIR环境变量或自定义安装路径,rsync 同步的vendor/位置可能和 autoloader 预期不一致
正确做法是在 deploy:sync 之后,远程执行 composer install,并确保目标机已预装 Composer 和对应 PHP 环境。
post-deploy 脚本在哪儿真正起作用
post-deploy 不是 Deployer 或 Capistrano 那种部署工具里的钩子,它只是 Composer 的一个自定义 script 名字。只有当你手动运行 composer run post-deploy,或者在某个脚本里用 @post-deploy 显式调用时,它才会执行。
- 它不会因为
git push或 CI 流水线完成就自动触发 - 如果你用 Deployer,它的
after('deploy:symlink', 'deploy:php')才是真正的部署后钩子,post-deploy脚本得你自己在 Deployer 任务里用run('cd {{release_path}} && {{bin/php}} {{release_path}}/composer.phar run post-deploy')去调用 - 很多团队误以为写了
post-deploy就万事大吉,结果上线后缓存没清、权限没设——因为根本没人运行它
真正容易被忽略的是:所有这些脚本都依赖目标环境的稳定性。PHP 版本、扩展、磁盘空间、SSH 连接超时、甚至 /tmp 目录是否可写,任何一个点异常都会让看似自动的流程停在半路。别迷信“一键”,先确保每条命令单独跑通。










