Android Studio中Gradle的commandLine调用自定义CLI程序失败
问题解决:Gradle执行bash脚本找不到npm全局命令(M1 macOS)
问题场景
- 环境:搭载M1芯片的macOS,运行ARM版Android Studio
- 项目中定义的Gradle
minifyJs任务:
import org.apache.tools.ant.taskdefs.condition.Os task minifyJs { if (Os.isFamily(Os.FAMILY_WINDOWS)) { exec { commandLine 'cmd', '/c', "scriptFolder\\minify.bat" } } else { exec { commandLine 'sh', "scriptFolder/minify.bash" } } }
- 执行任务时报错:
SurveyV2/minify.bash: line 2: uglifyjs-folder: command not found FAILURE: Build completed with 2 failures. 1: Task failed with an exception. ----------- * Where: Build file 'some/path/build.gradle' line: 61 * What went wrong: A problem occurred evaluating project ':ProjectName'. > Process 'command 'sh'' finished with non-zero exit value 127
- 已知现象:
- 在Android Studio终端标签页和macOS本地终端执行该脚本均正常
- 注释该Gradle任务后,构建可正常完成
- 将
commandLine中的脚本替换为ls、echo等系统命令时可正常执行
解决办法
1. 直接使用命令的绝对路径
在终端执行which uglifyjs-folder,得到命令的绝对路径(比如/opt/homebrew/bin/uglifyjs-folder),然后修改minify.bash脚本,把uglifyjs-folder替换成这个绝对路径。
2. 在Gradle任务中注入完整PATH环境变量
Gradle执行exec任务时的默认PATH不包含Homebrew的路径(M1上Homebrew默认路径是/opt/homebrew/bin),可以在任务中手动注入用户的PATH:
else { exec { commandLine 'sh', "scriptFolder/minify.bash" // 注入当前用户的PATH环境变量 environment 'PATH', System.getenv('PATH') } }
如果上述方式无效,也可以直接把Homebrew的bin路径加到PATH最前面:
environment 'PATH', "/opt/homebrew/bin:" + System.getenv('PATH')
3. 让Android Studio继承系统环境变量
如果Android Studio是从Launchpad启动的,它不会加载~/.zshrc或~/.bash_profile里的环境配置。改成从终端启动Android Studio:
open -a "Android Studio"
这样Android Studio会继承终端的PATH,Gradle执行时就能找到全局npm命令。
原因说明
M1芯片的macOS上,Homebrew默认安装在/opt/homebrew/bin,这个路径会被添加到用户shell的PATH中(通过~/.zshrc或~/.bash_profile)。但Gradle的exec任务默认使用的环境变量PATH不包含这个路径,所以找不到通过npm全局安装的uglifyjs-folder命令;而终端中因为加载了shell配置,PATH包含该路径,因此脚本可以正常执行。
内容的提问来源于stack exchange,提问作者h3dkandi
相关产品推荐
相关产品推荐

