composer脚本非部署工具,仅顺序执行命令;应拆分build:frontend、deploy:sync、deploy:install、deploy:post等阶段化脚本;post-install-cmd在--no-dev下默认禁用,关键操作需抽为独立脚本显式调用;php脚本比shell更稳,须加载autoload、校验环境、错误exit(1);rsync须排除vendor/和node_modules/,目标机必须重装vendor并加--classmap-authoritative。

Composer 脚本不是部署工具,它只负责按顺序执行命令;所谓“链式操作”,本质是把 git pull、composer install、php artisan migrate 这些离散动作用 scripts 字段串起来,并靠 composer run-script 显式触发——不手动调,它就永远不跑。
怎么定义可复用的阶段化脚本
把“编译”和“部署”拆成独立阶段,比写一个巨长的 deploy 更易调试、回滚和 CI 分步调用。
-
build:frontend:调用npm ci && npm run build,输出到public/build/ -
deploy:sync:用rsync -avz --exclude="vendor/" --exclude=".git" ./ user@prod:/var/www/app/推代码(注意排除vendor/) -
deploy:install:远程执行ssh user@prod 'cd /var/www/app && composer install --no-dev --optimize-autoloader --classmap-authoritative' -
deploy:post:清缓存、设权限、软链存储目录,例如php artisan config:cache && chown -R www-data:www-data storage/
所有命令必须用 && 连接或封装进 shell 脚本,否则前一步失败,后一步仍会执行。
为什么 post-install-cmd 在生产机上常失效
因为 composer install --no-dev 默认禁用所有开发期脚本钩子,post-install-cmd 会被跳过——它不是“装完就跑”,而是“装完且未禁用时才跑”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 构建机上运行
composer install --no-dev,post-install-cmd不触发 - 生产服务器上没显式加
--no-dev,但环境变量COMPOSER_NO_DEV=1同样会禁用钩子 - 正确做法:把关键逻辑(如
config:cache)抽成独立脚本名(如deploy:cache),再用composer run-script deploy:cache --no-dev显式调用
PHP 脚本比 shell 命令更稳的关键点
直接写 "clear-cache": "php artisan cache:clear" 看似简单,但一旦 artisan 路径错、PHP 版本不一致或 autoloader 没加载,就会失败。换成 PHP 脚本可控制上下文。
- 脚本开头必须
require_once __DIR__ . '/../vendor/autoload.php';,确保类能加载 - 用
getenv('APP_ENV')判断环境,避免本地误清生产缓存 - 敏感操作加防护:比如迁移前检查
if (getenv('APP_ENV') !== 'prod') { exit(1); } - 错误要抛异常或
exit(1),让composer run-script感知失败并中断后续步骤
rsync 同步后必须在目标机重装 vendor
同步整个项目目录(含 vendor/)是高频误操作,会导致类加载路径错乱、权限继承混乱、传输中断风险高。
-
rsync命令必须带--exclude="vendor/"和--exclude="node_modules/" - 同步完成后,必须在目标机执行
composer install --no-dev --optimize-autoloader,而非依赖本地已有的vendor/ - 若目标机无全局
composer,改用php composer.phar install --no-dev,路径需明确(如/var/www/app/composer.phar) -
--classmap-authoritative必须加上,否则自动加载可能 fallback 到扫描磁盘,性能差且不可靠
最易被忽略的是:所有远程命令(ssh、rsync、php artisan)都得预设好用户权限、PHP 路径和工作目录,不能依赖当前 shell 的环境变量或别名——它们在 composer run-script 子进程中不可见。










