GitHub user TimBarham opened a pull request:
https://github.com/apache/cordova-lib/pull/194
CB-8754 Auto-restoring a plugin fails when adding a platform.
Start with a blank Cordova app, then enter the following:
cordova plugin add org.apache.cordova.camera --save
cordova plugin remove org.apache.cordova.camera
cordova platform add browser
The final step should restore the camera plugin, but it fails with the
following exception:
TypeError: Cannot read property 'latest' of undefined
at next
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\lib\cache.js:694:35)
at
D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\lib\cache.js:682:5
at RegClient.get_
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\npm-registry-client\lib\get.js:105:14)
at RegClient.<anonymous>
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\npm-registry-client\lib\get.js:41:12)
at fs.js:336:14
at
D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\graceful-fs\graceful-fs.js:103:5
at FSReqWrap.oncomplete (fs.js:99:15)
The core problem here is an issue with how we work with npm. Every time we
are going to use npm (when dealing with plugins), we call `npm.load()` passing
it our settings. But `npm.load()` can only be called once per session -
subsequent calls are ignored. The correct approach is to call `npm.load()`
without any settings (to make sure npm is loaded), then call `npm.config.set()`
for each setting. This change had been made for platforms, but not plugins.
I also wanted to make sure each time we worked with npm we had a clean
config (for example, if we get an npm package from the Cordova Plugin
Respository, then later from the npm repository, it would try to get the second
package from the CPR because that setting would still be around and not get
overridden). So now any code that wants to load and init npm I pass through a
central "load and restore" method. You pass this method your npm settings and
the chain of promises you want to execute with those settings applied. It loads
and initializes npm, executes the promises, then restores npm's configuration
to what it was before we started.
Finally, once that problem was fixed there was an additional problem - we
were adding plugins too early and the platform wasn't fully initialized, so
we'd get an error about not being able to find the platform's `config.xml` file.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/MSOpenTech/cordova-lib CB-8754
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/cordova-lib/pull/194.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #194
----
commit 0df6b800c6013bcf53045040ade81345fd9b47ec
Author: Tim Barham <[email protected]>
Date: 2015-03-26T11:54:37Z
CB-8754 Auto-restoring a plugin fails when adding a platform.
Start with a blank Cordova app, then enter the following:
cordova plugin add org.apache.cordova.camera --save
cordova plugin remove org.apache.cordova.camera
cordova platform add browser
The final step should restore the camera plugin, but it fails with the
following exception:
TypeError: Cannot read property 'latest' of undefined
at next
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\lib\cache.js:694:35)
at
D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\lib\cache.js:682:5
at RegClient.get_
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\npm-registry-client\lib\get.js:105:14)
at RegClient.<anonymous>
(D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\npm-registry-client\lib\get.js:41:12)
at fs.js:336:14
at
D:\GIT\Cordova\cordova-lib\cordova-lib\node_modules\npm\node_modules\graceful-fs\graceful-fs.js:103:5
at FSReqWrap.oncomplete (fs.js:99:15)
The core problem here is an issue with how we work with npm. Every time we
are going to use npm (when dealing with plugins), we call npm.load() passing it
our settings. But npm.load() can only be called once per session - subsequent
calls are ignored. The correct approach is to call npm.load() without any
settings (to make sure npm is loaded), then call npm.config.set() for each
setting.
This change had been made for platforms, but not plugins. I also wanted to
make sure each time we worked with npm we had a clean config (for example, if
we get an npm package from the Cordova plugin respository, then later from the
npm repository, it would try to get the second package from the CPR because
that setting would still be around and not get overridden). So now any code
that wants to load and init npm I pass through a central "load and restore"
method. You pass this method your npm settings and the chain of promises you
want to execute with those settings applied. It loads and initializes npm,
executes the promises, then restores npm's configuration to what it was before
we started.
Finally, once that problem was fixed there was an additional problem - we
were adding plugins too early and the platform wasn't fully initialized, so
we'd get an error about not being able to find the platform's config.xml file.
----
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]