所有 scripts 命令默认在项目根目录执行,即以 composer.json 所在目录为当前工作目录(getcwd),而非 vendor/bin 或 php 安装路径;因此 php artisan migrate 等命令能正常运行,前提是 artisan 文件位于根目录下。

composer.json 里的 scripts 命令默认在哪执行
所有 scripts 中定义的命令(包括 post-install-cmd、deploy:clear-cache 等)都以项目根目录为当前工作目录(getcwd()),不是 vendor/bin,也不是 php 安装路径。这点很关键——你写 php artisan migrate 能跑通,是因为它在项目根下找 artisan;但写 ./bin/mytool 就可能失败,除非该路径存在且有执行权限。
路径相关常见错误现象
本地能跑,部署机上报 Command "migrate" is not defined 或 No such file or directory,大概率是以下之一:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 脚本里用了相对路径如
../config/app.php,而实际执行时目录结构不同 - 调用外部二进制(如
mysql、redis-cli)时没写绝对路径,且部署机$PATH不含对应目录 - PHP CLI 的
include_path或open_basedir限制导致@php -r "require 'xxx.php'"失败 - 用
cd some-dir && php script.php切目录后,后续命令仍期望在原目录下操作文件
怎么确保路径安全可靠
别依赖 shell 当前状态,显式锚定一切可变路径:
- 用
${PWD}替代.或空路径:例如chmod -R 755 ${PWD}/storage - PHP 脚本内优先用
__DIR__或dirname(__FILE__),而不是getcwd() - 调用系统命令前先检查是否存在:
command -v mysql >/dev/null || { echo "mysql not found"; exit 1; } - 避免
cd后链式执行;改用子 shell:(cd ${PWD}/tools && ./build.sh) - 如果必须跨目录操作,统一用
php -d "auto_prepend_file=${PWD}/bootstrap.php"注入基础路径常量
为什么不能直接用 ~ 或 $HOME
~ 在 shell 中由终端解释,但 Composer 执行 scripts 时走的是 PHP 的 proc_open,不经过 shell 层(尤其当值是数组形式而非单字符串时)。所以 "cp config/.env.example ~/myproject/.env" 会报错或复制到错误位置。同理,$HOME 在非交互式环境(如 CI/CD 的 systemd service 或 supervisord)中可能为空或指向 root 用户家目录。真正可靠的只有 ${PWD} 和绝对路径硬编码(后者不推荐,破坏可移植性)。










