cordova-lib: Cordova doesn't work with NPM 7

Bug Report

I’ve been running the new npm version (7) and this is the first project that I had problems with.

Problem

Running the following commands gives an error:

cordova platform remove android
cordova platform add android --verbose

What is expected to happen?

Installation of cordova-android@^9.0.0

What does actually happen?

No scripts found for hook "before_platform_add".
No version supplied. Retrieving version from config.xml...
Grabbing pinned version.
Using cordova-fetch for cordova-android@^9.0.0
fetch: Installing cordova-android@^9.0.0 to /home/unknown/git/REDACTED_PROJECT_DIR
Running command: npm install cordova-android@^9.0.0 --save-dev
Command finished with error code 0: npm install,cordova-android@^9.0.0,--save-dev
Failed to fetch platform cordova-android@^9.0.0
Probably this is either a connection problem, or platform spec is incorrect.
Check your connection and platform name/version/URL.
CordovaError: CordovaError: Could not determine package name from output:
added 48 packages, and audited 1015 packages in 4s

4 packages are looking for funding
  run `npm fund` for details

14 vulnerabilities (12 low, 1 moderate, 1 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
CordovaError: Failed to fetch platform cordova-android@^9.0.0
Probably this is either a connection problem, or platform spec is incorrect.
Check your connection and platform name/version/URL.
CordovaError: CordovaError: Could not determine package name from output:
added 48 packages, and audited 1015 packages in 4s

4 packages are looking for funding
  run `npm fund` for details

14 vulnerabilities (12 low, 1 moderate, 1 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
    at /home/unknown/npm/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/platform/addHelper.js:288:31
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

Information

Like I stated before, its specific to npm 7, the new version that isn’t out yet but its about to be https://github.blog/2020-10-13-presenting-v7-0-0-of-the-npm-cli/ https://blog.npmjs.org/post/626173315965468672/npm-v7-series-beta-release-and-semver-major

Command or Code

npm i -g npm@next-7 followed by cordova platform rm android && cordova platform add android --verbose the usage of npm 7 can be reverted with: npm i -g npm@6 which installs 6.x.x

Environment, Platform, Device

Environment:

    OS: LinuxMint 20 (linux 5.4.0-48-generic) x64
    Node: v12.19.0
    npm: 7.0.0

Version information

Cordova Packages:

    cli: 10.0.0
        common: 4.0.2
        create: 3.0.0
        lib: 10.0.0
            common: 4.0.2
            fetch: 3.0.0
            serve: 4.0.0

Checklist

  • I searched for existing GitHub issues
  • I updated all Cordova tooling to most recent version
  • I included all the necessary information above

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 4
  • Comments: 15 (12 by maintainers)

Most upvoted comments

A few days ago, we released cordova-fetch@3.0.1. This issue should now be resolved. Make sure to re-install cordova to get the latest version of that dependency.

I just merged apache/cordova-fetch#91. If we release the current master of cordova-fetch as 3.0.1 then that should make cordova work with npm@7 without any other releases (users need to re-install cordova to get the fixed cordova-fetch).

However, I won’t be able to do the release myself. So if someone could handle that task, that would be great.

One approach would be to first resolve everything we need to manifests (which contain the package name) and tarballs, then install everything in one go. Our custom plugin dependency resolution will probably be a challenge, as usual.

Here’s an example on how to get a manifest with npm’s pacote. It also has builtin caching, so we should be able to pull this off without hitting the network multiple times for one package.

If done properly this has the potential to greatly improve our prepare speed in various scenarios, so there might come something good of it.

I’ve also observed the same error on other commands that involves installing npm packages, such as cordova plugin add ...

Just use below command :

  1. npm uninstall -g cordova
  2. npm install -g cordova

It appears that npm v7 doesn’t print out a list of things that it installs (either as text or with the --json option, and not even with --verbose), which means we probably need to come up with a new strategy for dealing with installations 😞

As it currently stands, Cordova support for npm v7 is not going to be quick or easy.

cordova-fetch is what deals with most of the calling out to npm, but more importantly also the parsing of the installation results. Might be worth trying to run the cordova-fetch unit tests with npm v7 and see what happens.