【问题标题】:Cordova error: Using "requireCordovaModule" to load non-cordova module "q" is not supportedCordova 错误:不支持使用“requireCordovaModule”加载非 Cordova 模块“q”
【发布时间】:2019-03-22 16:33:48
【问题描述】:

我注意到由于以下错误,我们的 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最近发布了。

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

  • GH-710 删除 Q 依赖并使用原生 Promise
  • GH-707 弃用非 Cordova 模块的 requireCordovaModule

我的第一个想法是不知何故我们没有锁定我们的科尔多瓦版本,但我们确实在我们的 dockerfile 中将其锁定为cordova@8.1.2。我还在我的本地机器上测试了它,我也在科尔多瓦版本8.1.2 上进行了测试。所以这不是问题。

在查看了一些日志之后,我注意到了一些类似这样的日志:

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

有几个,比如 3 个或 4 个,但构建并没有在发生时停止。

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

似乎以某种方式更新了一些更深层的依赖项,这导致了问题。

感谢您的帮助。

【问题讨论】:

    标签: cordova cordova-plugins


    【解决方案1】:

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

    npm install -g cordova@8.1.2

    现在,它又开始工作了。

    如果您想继续使用最新版本的 cordova,请转到以下说明:
    https://stackoverflow.com/a/58956882/9536897

    【讨论】:

    • 这对我不起作用,我已经安装了cordova 8.1.2,但仍然出现错误。
    • 这对我有用。谢谢你。另外,如果您删除了cordova平台,请注意其他人,请确保将cordova平台添加到适合您的版本。
    • 这不是解决方案,而是解决方法。它对我有用。猜猜我们必须等到cordova开发人员修复它。
    • 祝福你!除了这个问题。如果您正在尝试创建 IOS 项目:使用“cordova platform add ios@4.5.5”作为 IOS 平台
    • 也为我工作!谢谢
    【解决方案2】:

    简单:

    将 requireCordovaModule 替换为 require :

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

    【讨论】:

    • 在哪里替换这个?在哪个文件?
    • 通常需要更改插件文件。您必须检查错误刷新,以便找到需要替换的位置。
    • 我修改了 hooks/beforeedep.js 和 hookers.js。但是当我执行命令行时仍然出现错误:cordova build android --release --buildConfig
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这个解决方案对我有用 - 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
      

      编辑:我最近发现正在运行:

      cordova platform add ios && cordova platform add android
      

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

      【讨论】:

        【解决方案5】:

        我也遇到了这个。就我而言,我需要删除一个有问题的插件cordova-plugin-camera-preview,它将"cordova": "*" 列为依赖项。这将在ionic cordova build 期间安装cordova 9.0.0

        【讨论】:

        • 这实际上可能是我的问题。当我知道更多时,我会回复你。
        • 这是一条红鲱鱼。插件不需要对 cordova:* 的依赖,但这意味着您将安装全局 cordova,并且在项目的 node_modules 文件夹中将有一个未使用的 cordova@latest。
        • 如果可用的话,离子 cli 似乎会使用 node_modules 中的版本。 github.com/ionic-team/ionic-cli/commit/… 在添加插件之前运行ionic info 显示全局安装的cordova 版本(在我的情况下为8.1.2),在显示@latest (9.0.0) 之后运行它。在之前和之后运行 cordova -v 会按预期显示 8.1.2。删除插件解决了这个问题(并从 node_modules/.bin 中删除了 cordova)
        • 尽管大多数人的解决方法是简单地降级到 8.1.2,但我在问题中明确指出,我已将我的 cordova 版本修复为 8.1.2,但它仍然无法正常工作。原因是相机预览插件和 ionic 的一些奇怪组合,它基本上只是忽略了定义的 cordova 版本,并且无论如何都使用了 9.0.0。所以事实证明,在我的具体情况下,它与这个问题完全相关,这就是为什么这是公认的答案。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          就是这样,我找到了。 它来自对 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

          【讨论】:

          • 问题来自...\plugins\cordova-android-support-gradle-release\scripts\apply-changes.js,在新版本中已修复。
          • 这个特定的插件不是问题。解决方案是更新所有cordova插件,感谢提示
          【解决方案8】:

          更新到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、platforms 和 plugins 文件夹
          2. 删除 package.json 和 package-lock.json
          3. 从 config.xml 插件/平台/引擎中删除
          4. 添加您的平台,例如:cordova platform add android
          5. 添加更新的插件,例如:cordova plugin add cordova-plugin-whitelist
          6. 例如:npm install
          7. 构建:cordova build

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

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

          希望此帮助或至少为某人指明正确的方向:)

          【讨论】:

          • 找不到模块'properties-parser'
          【解决方案9】:

          这对我有用: 我通过调用

          删除了科尔多瓦
          npm uninstall cordova -g
          

          然后用

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

          【讨论】:

          • 这对我有用。非常感谢。 (我有科尔多瓦 9.0)
          • 当我卸载cordova 10.0.0然后安装cordova 8.1.2,然后通过命令cordova -v查看corodva的版本。终端会出现一些警告如下: 有人有解决方案吗? (节点:17636)警告:在循环依赖中访问模块导出的不存在的属性“cat”(使用node --trace-warnings ...显示警告的创建位置)(节点:17636)警告:访问不存在的属性“cd”循环依赖中的模块导出
          【解决方案10】:

          正如错误所说,您需要 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;
          

          【讨论】:

            【解决方案11】:

            删除cordova-plugin-crosswalk-webview

            【讨论】:

            • 我理解反对票(不是 OP 所说的插件),但这对我有帮助,因为人行横道是导致我出现此错误的问题。
            • 我同意。为了找出导致错误的插件,您必须使用--verbose 运行命令。
            • package.json 和 package-lock.json 都必须修改?
            【解决方案12】:

            我有同样的问题。 我就是这样解决我的问题的:

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

                以下是查找requireCordovaModule 所在位置的小技巧:

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

                grep -r 'requireCordovaModule' ./
                

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

                【讨论】:

                  【解决方案15】:

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

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

                  我使用 CI,但在管道中它给出了错误。许多形式建议将科尔多瓦降级到 8 倍(顺便说一句,当我收到此错误时更新到 9.0.0).. 它可以工作,但再次降级永远不会好。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-05-08
                    • 1970-01-01
                    相关资源
                    最近更新 更多