composer不是部署工具,其scripts仅作本地命令触发点;远程部署需显式ssh调用,deployer应通过phar全局安装;docker中composer install必须加--no-dev、--optimize-autoloader、--classmap-authoritative参数。

Composer 本身不是部署工具,它没有内置的“部署”能力;所谓“Composer 自动化部署”,本质是利用它的 scripts 机制 + 外部命令(如 git、rsync、php artisan)或集成 Deployer/Capistrano 等工具来串联流程。直接指望 composer install 把代码推到服务器上,会卡在第一步。
composer.json 的 scripts 不是万能胶,但它是触发点
所有自动化动作都得从 scripts 字段发起,但它只负责执行命令,不负责判断环境、处理权限、做回滚。常见误用是把一堆 ssh 和 rsync 命令硬塞进 post-update-cmd,结果本地一跑就炸——因为脚本默认在本地执行,不是在目标服务器上。
- 真正可用的模式是:定义清晰阶段,比如
pre-deploy(本地校验)、deploy:sync(推代码)、deploy:install(远程装依赖) - 涉及远程操作时,必须显式调用
ssh user@host 'cd /path && composer install --no-dev',不能只写composer install - 敏感操作(如数据库迁移)建议加
--no-interaction和--force,否则脚本会卡住等输入 - 别在
post-install-cmd里写部署逻辑——它会在每次composer install时触发,包括你在本地开发时,容易误伤
Deployer 不是 Composer 包,别用 require 装
运行 composer require deployer/deployer --dev 只会下载源码到 vendor/,不会生成全局可用的 dep 命令。你得到的是一个 PHP 库,不是可执行文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确安装方式是下载官方 PHAR:
curl -LO https://www.php.cn/link/490c348329a61872baf3a92c47a37f23,然后mv deployer.phar /usr/local/bin/dep && chmod +x /usr/local/bin/dep - 验证是否生效:
dep --version必须输出版本号,否则路径或权限有问题 - 如果坚持项目级使用(例如 CI 中不想全局装),才用
composer require deployer/deployer --dev,但必须在composer.json的scripts里手动注册:"dep": "vendor/bin/dep" -
deploy.php里调用composer install时,推荐用{{bin/php}} {{release_path}}/composer.phar而不是系统composer,避免目标机环境不一致
Docker 构建中 composer install 容易漏掉三个关键参数
在 Dockerfile 里写 RUN composer install 是最常见也最危险的写法。它会让镜像带上 dev 依赖、未优化的 autoloader,还可能因平台差异失败。
- 生产镜像必须加:
--no-dev --optimize-autoloader --classmap-authoritative,三者缺一不可 - CI 或多阶段构建中,务必挂载 Composer 缓存:
RUN --mount=type=cache,target=/root/.composer/cache composer install ...,否则每次重下包 - 跨平台构建(如本地 Intel Mac 构建 ARM 服务器镜像)要加
--ignore-platform-reqs,否则ext-pdo或php版本不匹配直接中断 - 不要把
composer.lock排除在缓存键之外——Docker 构建时应先COPY composer.json composer.lock ./,再RUN composer install,确保依赖变更才重建 vendor 层
真正的难点不在写多少行脚本,而在于明确每条命令的执行上下文:它在哪儿跑?以谁的身份?有没有权限?输出是否被静默?这些细节不厘清,自动化就会变成定时自爆装置。










