Composer脚本仅适合执行轻量、项目内、与依赖强相关的自动化操作;它本质是shell命令别名,应在项目根目录下以当前用户身份运行,不可替代专业部署工具。

Composer 脚本本身不能替代部署工具,它只适合执行轻量、项目内、与依赖强相关的自动化动作(比如清缓存、生成 autoload、运行迁移前检查);把它当 deploy.sh 用,迟早遇到权限、环境隔离、回滚失败等问题。
composer.json 中的 scripts 字段能做什么
它本质是 shell 命令的快捷别名,由 composer run-script 触发,所有命令都在当前项目目录下以当前用户身份执行。适合的场景包括:
- 开发阶段的本地辅助操作(
php artisan optimize:clear、php bin/console cache:clear --no-warmup) - CI 流水线中的构建检查(
php -l扫语法、vendor/bin/phpcs) - 发布前的轻量自检(确认
.env存在、storage可写、APP_ENV=production已设)
不建议放这些操作:git pull、rsync、服务重启(systemctl restart nginx)、数据库迁移(php artisan migrate 应由部署系统控制)、修改系统级配置。
scripts 里怎么调用 PHP 类方法
直接写命令行调用即可,无需额外注册 —— Composer 不管你用的是 Laravel、Symfony 还是自定义脚本,只要能从终端跑通就行。常见写法:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"scripts": {
"post-install-cmd": [
"@php -r \"file_put_contents('runtime/installed', date('c'));\""
],
"deploy:precheck": [
"php -r \"if (!file_exists('.env')) { exit(1); }\"",
"php artisan config:clear",
"php artisan view:clear"
]
}
注意点:
- 双引号内要转义内部双引号,或改用单引号包裹整个字符串
-
post-*类钩子(如post-update-cmd)会在composer install/update后自动触发,慎用于生产部署逻辑 - 如果脚本需要访问
vendor/autoload.php,推荐封装为独立 PHP 文件(如scripts/pre-deploy.php),再在 scripts 中调用:php scripts/pre-deploy.php
为什么 scripts 里的命令有时不生效
最常见三个原因:
- 脚本中用了相对路径(如
cp .env.example .env),但当前工作目录不是项目根目录 —— Composer 运行时 cwd 是composer.json所在目录,这点通常没问题;但若被其他工具嵌套调用(如 Jenkins 用cd /tmp/build && composer install),就可能出错 - 权限不足:例如
chmod -R 775 storage在容器或无 sudo 权限的部署账户下失败,错误被静默吞掉(加-v参数可看到真实报错) - 环境变量缺失:CI 环境里
$_SERVER['HOME']可能为空,导致某些组件(如 SSH 配置读取)异常;建议显式设置必要 env:APP_ENV=production php artisan config:cache
调试技巧:在 scripts 中临时加一句 echo "PWD: $(pwd) | USER: $(whoami)",确认上下文是否符合预期。
真正可靠的部署,得靠专用工具(Capistrano、Deployer、Ansible)或 CI/CD 平台(GitLab CI、GitHub Actions)来管理多机、回滚、锁机制和敏感凭据。Composer scripts 只该是其中一环,而不是主干。

















