答案是Composer自定义命令无需chmod +x或sudo,问题根源在于其执行时依赖的文件、目录或系统操作权限不足,如storage/不可写、.env无法生成等。

Composer 自定义命令本身不涉及“分配运行权限”——它不是系统二进制,也不需要 chmod +x 或 sudo 才能执行。真正要管的,是这些命令**执行时所依赖的文件、目录和系统操作的权限**。
为什么自定义脚本会报 Permission denied?
常见现象不是“命令不能运行”,而是脚本里某条命令失败,比如:
-
chmod -R 755 storage/报Operation not permitted -
php artisan key:generate写入.env失败 -
touch bootstrap/cache/services.php提示No such file or directory(其实是父目录不可写)
根本原因:当前用户对目标路径没有写权限,或目录属主是 root(比如之前误用 sudo composer install)。
post-install-cmd 脚本里改权限的正确写法
在 composer.json 的 scripts 中写权限操作,必须满足三个前提:
- 命令必须在项目根目录下执行(Composer 默认就是),不要写
cd ./或cd /var/www/html - Linux/macOS 下优先用
chmod和chown,但chown在容器或共享主机上常被禁用,慎用 - 避免硬编码绝对路径;用相对路径 +
$(pwd)或直接信任当前工作目录
推荐写法(兼容 Laravel 常见结构):
"post-install-cmd": [ "chmod -R 775 storage/", "chmod -R 775 bootstrap/cache/", "touch storage/logs/laravel.log", "chmod 664 storage/logs/laravel.log" ]
注意:775 比 755 更稳妥,确保组内用户可写;664 是日志文件的标准权限,避免被 webserver 拒绝追加。
CentOS 上运行 Composer 脚本前必须检查的三件事
在 CentOS 部署时,以下三点没确认,90% 的权限问题会复现:
- 确认
composer二进制本身有执行权:ls -l $(which composer)应显示-rwxr-xr-x,否则补sudo chmod +x /usr/local/bin/composer - 确认项目目录归属是你当前用户:
sudo chown -R $USER:$USER ./(尤其刚从 git clone 或create-project拿来时) - 确认
COMPOSER_HOME没指向/root/.composer:echo $COMPOSER_HOME,若为空则默认可能落在 root 目录下,应提前设为export COMPOSER_HOME="$HOME/.composer"
最易被忽略的一点:所有权限操作都只在本地生效,CI/CD 流水线或 Docker 构建中,post-install-cmd 运行用户可能是 www-data 或 node,不是你本地的 $USER —— 此时得在 CI 配置里显式指定用户,或改用 entrypoint 脚本兜底。











