cordova requirements报错cannot read property “length“ of undefined

巨坑警告⛏

问题

Cordova build 时候报错 Cannot read property ‘length’ of undefined
在这里插入图片描述
我的配置
在这里插入图片描述

解决方法

方法一:
大多数人出现这个原因是因为没有配置gradle环境,android studio 3.5开始不自带gradle导致
恰巧我也是android studio 3.5,恰巧我也没有配置gradle环境,于是第一步

配置gradle环境

下载合适的gradle版本 gradle官网
可以选择下载最新版,由于我在虚拟机上测试过build时候用的是4.10.3版本,所以下的是这个版本。

解压到

D:\Program Files\Android\Android Studio\gradle\gradle-4.10.3-all\gradle-4.10.3

在 环境变量中新建 GRADLE_HOME 系统变量
在这里插入图片描述
添加到 path 中 %GRADLE_HOME%\bin

如果还是检测不到可以尝试先
cordova platform rm android

cordova platform add android
再使用
cordova requirements
对环境进行测试,一般这时候就可以检测到gradle

但如果你不幸像我这样……那么请看方法二和方法三。
在这里插入图片描述

方法二:
如果上一步添加环境变量后,重启还是无法解决这个问题,那么可以看这一步

如果有虚拟机环境,可以配置一个虚拟机,配置虚拟机环境,在虚拟机上尝试安装ionic,cordova,java环境。
一般虚拟机上重新配置的是不会出问题的,但是这个方法有个弊端,就是虚拟机环境无法安装android 模拟机,因为它也是使用虚拟机技术的,而且native-run也无法运行在虚拟机操作系统上。

如果选择配置在虚拟机上的话,有一个优点就是环境如果出问题,随时可以重装。

至于虚拟机上无法提供 安卓模拟机的问题,这里也提供一种解决方案,可以在虚拟机上先执行cordova build android命令,在platform/android/app/build/output中可以找到生成的apk。
将项目通过共享文件夹或者其他方法,转移到本机上,使用本机android studio,进行安卓方面的调试,
可将输出的 app-debug.apk 放在 D:\asua\Andriod\sdk\platform-tools(你的sdk路径)文件夹下,
在 android studio 终端该路径下(或者cmd该路径下)
使用 adb install xxx(apk包名,如我的就是app-debug.apk),如果有多个模拟机,就可以使用adb -e install xxx(apk包名,如我的就是app-debug.apk) 安装在 正在运行的模拟器 上。

这种方法的弊端就是效率较低,虚拟机运行速度缓慢,往往调试生成几个版本需要的时间较多,这也是我放弃该种方法的原因。当然,无奈之下这也不失为一种好的选择。

方法三:
为了找到这个解决方法真是找了我三天……太痛苦了……

无意之中看到stack overflow上有个评论说,之前的6.4版本在check_reqs.js文件中出现过相似问题。

这个文件位于platform \ android \ cordova \ lib文件夹下

关注这段代码的get_gradle_wrapper函数

module.exports.get_gradle_wrapper = function () {
   
    var androidStudioPath;
    var i = 0;
    var foundStudio = false;
    var program_dir;
    // OK, This hack only works on Windows, not on Mac OS or Linux.  We will be deleting this eventually!
    if (module.exports.isWindows()) {
   

        var result = child_process.spawnSync(path.join(__dirname, 'getASPath.bat'));
        // console.log('result.stdout =' + result.stdout.toString());
        // console.log('result.stderr =' + result.stderr.toString());

        if (result.stderr.toString().length > 0) {
   
            var androidPath = path.join(process.env['ProgramFiles']
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独忘机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值