Cordova error: Using "requireCordovaModule" to load non-cordova module "q" is not supported

Cordova error: Using "requireCordovaModule" to load non-cordova module "q" is not supported

我注意到 CI 上的构建由于以下错误而开始失败:

Discovered plugin "cordova-plugin-app-version" in config.xml. Adding it to the project

Installing "cordova-plugin-app-version" for android

Adding cordova-plugin-app-version to package.json
Using "requireCordovaModule" to load non-cordova module "q" is not supported. Instead, add this module to your dependencies and use regular "require" to load it.
[ERROR] Exception: 
The command '/bin/sh -c ionic cordova platforms add android' returned a non-zero code: 1

同样的问题发生在 iOS 和 Android 上。

经过一番挖掘,我发现 cordova 9.0.0 最近发布了。

有一些与此问题相关的更改。

我的第一个想法是不知何故我们没有锁定我们的 cordova 版本,但我们确实在我们的 dockerfile 中将它锁定到 cordova@8.1.2。我也在我的本地机器上测试了它,我的 cordova 版本 8.1.2 也是如此。所以这不是问题。

再查看日志后,我注意到一些日志如下:

cordova-android version check failed ("/app/platforms/android/cordova/version"), continuing anyways.

有几个这样的,比如 3 个或 4 个,但是当发生这种情况时构建并没有停止。

然后我 运行 再次构建旧提交,它工作正常,可能是因为缓存了一些层。但是如果我只更改了一个包(我更新了 prettier 来尝试一下),它会导致大部分层被重建并且构建因上述错误而崩溃。

似乎某些更深层次的依赖项以某种方式得到了更新,这是导致问题的原因。

感谢您的帮助。

我已经回到之前的版本:8.1.2。

npm install -g cordova@8.1.2

现在,它又开始工作了。

如果您想继续使用最新版本的 cordova,请转到以下说明:

我运行成这个也。就我而言,我需要删除一个有问题的插件 cordova-plugin-camera-preview,它将 "cordova": "*" 列为依赖项。这将在 ionic cordova build

期间安装 cordova 9.0.0

似乎是 cordova 9.0.0 的问题,请参阅此 issue ticket

看起来它已经修复并将包含在下一个(9.0.1?)版本中。

我在更新到 9.0.0 后也遇到了这个错误。就我而言,我修复了它并进行了清理并重建了我的应用程序。您可以尝试以下步骤。

首先

  1. 更新科尔多瓦:npm install -g cordova
  2. 更新 SDK,例如:./android/tools/bin/sdkmanager "build-tools;28.0.3" "platforms;android-28"
  3. 将 SDK 路径添加到您的系统 (1),例如:在 bashrc export ANDROID_SDK_ROOT=~/android

(1) ANDROID_HOME 已弃用但仍然有效

在您的 Cordova 项目中

  1. 删除node_modules平台插件文件夹
  2. 删除package.jsonpackage-lock.json
  3. config.xml 中删除 plugins/platforms/engine
  4. 添加您的平台,例如:cordova platform add android
  5. 添加更新的插件,例如:cordova plugin add cordova-plugin-whitelist
  6. 例如:npm install
  7. 构建:cordova build

您可以通过以下方式查看您的应用简历:cordova info

如果您想查看您的插件列表,您可以使用:cordova plugins ls

希望这能有所帮助,或者至少能为某人指明正确的方向:)

删除 cordova-plugin-crosswalk-webview

这个解决方案对我有用 - https://github.com/xpbrew/cordova-sqlite-storage/issues/856#issuecomment-497298630

对于与此错误相关的任何插件,运行:

cordova platform rm ios
cordova platform rm android
cordova plugin rm <package-name>

npm i <package-name>@latest
cordova plugin add <package-name>
cordova platform add ios
cordova platform add android

编辑:我最近发现 运行ning:

cordova platform add ios && cordova platform add android

不会 安装最新版本,有人会很好地解释为什么这与 运行 单独安装它们不同,但这是我的问题。

这对我有用: 我通过调用

删除了 cordova
npm uninstall cordova -g

然后使用

再次全局安装它
npm install -g cordova@8.1.1

简单:

将 requireCordovaModule 替换为要求:

requireCordovaModule("q")require("q")

我遇到了同样的问题。 我就是这样解决我的问题的:

cordova plugin | awk '{ print "cordova plugin rm "  " && cordova plugin add "  }' | sh
ionic cordova remove android && ionic cordova add android

C:\Windows\System32 到我的 PATH 变量来解决这个奇怪的问题。

就是这样,我找到了。 它来自对 cordova cli @9.0.0 的更新,它附加在现有项目上。
该问题来自 cordova-android-support-gradle-release 并已在最新版本中修复。

所以无论如何,你需要做的是:
cordova plugin rm cordova-android-support-gradle-release
cordova plugin add cordova-android-support-gradle-release@latest

我可以通过将 cordova 降级到 8.1.1 来解决这个问题。

npm remove cordova -g && npm install -g cordova@8.1.1

如错误所述,您需要要求 q。转到 npmInstall.js (在您的项目中搜索 requireCordovaModule 然后您将看到 npmInstall.js )。

然后,添加这些行;

var q = require('q');
var npmModule = require('npm');

并将:var Q = context.requireCordovaModule('q');替换为

var Q = context.q;

并将:var npm = context.requireCordovaModule('npm');替换为

var npm = context.npmModule;

这里有一个查找 requireCordovaModule 存在位置的小技巧:

对于那些希望将 requireCordovaModule 更改为 require 的人,我发现使用以下命令可以轻松地从命令行直接搜索 requireCordovaModule 文本:

grep -r 'requireCordovaModule' ./

然后,您可以深入研究这些文件并将 requireCordovaModule 重命名为 require

在我的项目中遇到了同样的问题。

可以肯定的是函数 requireCordovaModule 没有被弃用(目前)

我使用 CI,但在管道中出现错误。许多表格建议将 cordova 降级到 8x(当我收到此错误时顺便更新到 9.0.0).. 它有效但再次降级永远不会好。

我在管道中的步骤之一是 ionic cordova build,我将其替换为 ionic cordova run 无需任何代码更改即可运行