scripts字段必须定义在composer.json根目录顶层,支持显式调用(如composer run)和隐式事件(如post-install-cmd),仅四个事件适用于部署:post-install-cmd、post-update-cmd、post-root-package-install、post-create-project-cmd。

composer.json 里 scripts 字段怎么写才生效
Composer 的自动安装脚本靠 scripts 字段驱动,它不是插件或钩子系统,而是命令别名 + 生命周期事件触发器的组合。写错位置或命名不匹配,脚本就完全不会执行。
必须把脚本定义在根目录 composer.json 的顶层 scripts 对象里,不能嵌套在 extra 或其他字段中。支持两类触发方式:显式调用(如 composer run post-install-cmd)和隐式事件(如安装完成后自动触发 post-install-cmd)。
-
post-install-cmd和post-update-cmd是最常用的两个事件,分别在composer install和composer update成功后触发 - 自定义脚本名(如
deploy:clear-cache)必须通过composer run deploy:clear-cache显式执行,不会自动触发 - 脚本值可以是字符串(单条命令)、字符串数组(顺序执行)或关联数组(带
script和description)
哪些事件能用于部署自动化任务
部署时真正可用的生命周期事件有限,别指望 pre-autoload-dump 或 post-autoload-dump 能干部署的事——它们只在 autoloader 重建时触发,跟文件复制、权限设置、缓存清理等部署动作无关。
真正靠谱的只有四个:
-
post-install-cmd:CI/CD 流水线拉完代码后首次安装依赖时执行 -
post-update-cmd:本地开发更新依赖后同步环境状态 -
post-root-package-install:仅在根包(即你自己的项目)安装完成时触发,适合初始化配置文件 -
post-create-project-cmd:用composer create-project初始化新项目时执行,适合模板项目预设
注意:post-install-cmd 在 --no-scripts 或 --no-autoloader 下默认不执行;生产环境部署建议显式加 --no-interaction --no-dev,但不要漏掉 --no-scripts 否则可能意外触发开发用脚本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
执行外部命令时路径和权限容易出什么问题
脚本运行时的当前工作目录是 Composer 执行命令的位置(通常是项目根目录),但环境变量、用户权限、PHP CLI 配置可能和 Web 服务器或部署用户不一致,导致 php artisan migrate 或 chmod -R 755 storage/ 失败。
- 避免使用相对路径操作文件,统一用
$(pwd)或${PWD}显式锚定,比如"chmod -R 755 ${PWD}/storage" - 不要在脚本里直接调用
php,改用php ./artisan或php -d memory_limit=-1 ./artisan,防止 CLI ini 配置限制内存 - Linux 下若用 www-data 用户部署,
post-install-cmd实际以当前 shell 用户身份运行,需提前确保该用户对storage/、bootstrap/cache/有读写权 - Windows 上
chmod、chown类命令无效,得用 PowerShell 替代或跳过
如何让脚本只在生产环境运行
Composer 本身不区分环境,scripts 一视同仁。想实现“开发机不跑迁移,服务器才跑”,得靠条件判断,而不是删掉脚本。
推荐两种轻量方案:
- 用环境变量控制:在部署脚本里设
COMPOSER_ENV=prod,然后在composer.json中写"post-install-cmd": ["[ \"$COMPOSER_ENV\" = \"prod\" ] && php artisan migrate --force || echo 'Skipped migration'"] - 检查是否存在特定文件:比如检测
.env.production是否存在,"[ -f .env.production ] && php artisan optimize:clear"
别用 php -r "if (getenv('APP_ENV') === 'production') { ... }" 这种方式——APP_ENV 是应用层变量,此时 Laravel 还没启动,.env 甚至都还没被加载。
实际部署中,最常被忽略的是脚本执行失败时的静默吞没:Composer 默认不中断后续操作,即使 php artisan migrate 报错,install 仍显示 success。务必在关键脚本末尾加 && echo "OK" || exit 1 显式传递退出码。

















