Laravel中调用Gradle assemble构建APK无输出、子脚本不执行问题
问题根因
这种本地终端执行正常、Web触发Laravel调用异常的问题,核心是运行身份和环境差异导致:
- 你终端登录时使用的是root或者高权限账号,而Laravel运行在Web服务下,对应的执行用户是
www-data、nginx、apache这类低权限用户 - 低权限用户默认没有
/root目录的读写执行权限,也没有Android项目目录的写入权限,同时拿不到你终端用户配置的环境变量(比如Java、Gradle、Android SDK相关的环境变量,Gradle构建必须依赖这些变量才能正常工作) - 之前调用Python脚本时,subprocess执行PowerShell、调用flask.py也会遇到同样的权限问题,所以仅跑通了主Python文件的表层逻辑,子调用全部因为权限不足失败
解决方案
1. 调整目录权限
首先把需要被访问的代码、项目目录从/root下移出来,/root是root用户专属目录,其他用户默认无任何权限,你可以放到/opt或者/var/www目录下,给对应的Web运行用户赋权:
# 假设你的Web运行用户是www-data chown -R www-data:www-data /var/www/html/androidProject chmod -R 755 /var/www/html/androidProject
如果一定要保留目录在/root下,需要给www-data加sudo免密执行对应命令的权限:
编辑sudoers文件,添加以下内容:
www-data ALL=(ALL) NOPASSWD: /usr/bin/pwsh, /usr/bin/python3.6, /usr/bin/python3.7, /var/www/html/androidProject/gradlew
之后Laravel里调用命令时前缀加sudo即可,示例:
return shell_exec('cd /var/www/html/androidProject && chmod +x gradlew && sudo ./gradlew assembledemoDebug');
2. 手动补全环境变量
Gradle构建APK依赖JAVA_HOME、ANDROID_HOME等环境变量,Web运行用户的环境变量默认是空的,你需要在执行命令时手动加载:
先在终端执行echo $JAVA_HOME、echo $ANDROID_HOME拿到对应的路径,再修改Laravel里的调用命令:
return shell_exec('export JAVA_HOME=你查到的JAVA_HOME路径 export ANDROID_HOME=你查到的ANDROID_HOME路径 && cd /var/www/html/androidProject && chmod +x gradlew && ./gradlew assembledemoDebug');
3. 增加日志定位问题
如果调整后还是异常,可以把命令的错误输出重定向到日志文件,方便排查:
return shell_exec('cd /var/www/html/androidProject && chmod +x gradlew && ./gradlew assembledemoDebug >> /var/www/gradle_build.log 2>&1');
之后查看/var/www/gradle_build.log里的报错信息对应调整即可。
内容的提问来源于stack exchange,提问作者Hossam Hassan
相关产品推荐
相关产品推荐

