Mike Billau created CB-5016: ------------------------------- Summary: add then rm of dependent plugin as top level plugin breaks environment Key: CB-5016 URL: https://issues.apache.org/jira/browse/CB-5016 Project: Apache Cordova Issue Type: Bug Components: Plugman Environment: Windows 7 Reporter: Mike Billau
Removing a dependent plugin that was installed as a default top level plugin breaks the environment because during plugin add, the plugin name gets added to plugins/platform.json under "installed_plugins" and not under "dependent_plugins". However, in plugin rm, the plugin code gets fully removed from the work space but the name is left in "installed_plugins" because the tools search for it in "dependent_plugins." *Scenario 1* - Install the dependent plugin first cordova create Sample && cd Sample cordova platform add android cordova plugin add org.apache.cordova.file cordova plugin add org.apache.cordova.file-transfer (depends on File) cordova plugin ls [org.apache.cordova.file, org.apache.cordova.file-transfer] *Now if you look at platforms/android.json, you will see that both plugins were added to "installed_plugins"*: cat platforms/android.json {noformat} "installed_plugins": { "org.apache.cordova.file": { "PACKAGE_NAME": "io.cordova.hellocordova" }, "org.apache.cordova.file-transfer": { "PACKAGE_NAME": "io.cordova.hellocordova" } }, "dependent_plugins": {} {noformat} This leaves us in an invalid state when you go to remove the file-transfer plugin because for some reason it removes both the file-transfer and file plugin code, but it does not remove the file entry from "installed_plugins". cordova plugin rm org.apache.cordova.file-transfer cat platforms/android.json: {noformat} "installed_plugins":{"org.apache.cordova.file":{"PACKAGE_NAME":"io.cordova.hellocordova"}},"dependent_plugins":{}} {noformat} but: cordova plugin ls [No plugins added. Use cordova plugin add <plugin>] and: cordova build (and cordova prepare, etc.) [Error: ENOENT, no such file or directory, "C:\.........plugins\org.apache.cordova.file] *Scenario 2* - Install the lower level plugin and let plugman automatically install the dependencies: cordova create Sample2 && cd Sample2 cordova platform add android cordova plugin add org.apache.cordova.file-transfer (depends on File, it will automatically get pulled down and installed) cordova plugin ls [org.apache.cordova.file, org.apache.cordova.file-transfer] *Now if you look, /platforms/android.json will be different than in Scenario 1* cat platforms/android.json: {noformat} "installed_plugins": { "org.apache.cordova.file-transfer": { "PACKAGE_NAME": "io.cordova.hellocordova" } }, "dependent_plugins": { "org.apache.cordova.file": { "PACKAGE_NAME": "io.cordova.hellocordova" } } {noformat} You can see that now the File plugin is listed as a dependent_plugin. This is great, because now when you remove file-transfer, it will also remove file plugin: cordova plugin rm org.apache.cordova.file-transfer cat plugins/android.js: {noformat} "installed_plugins": {}, "dependent_plugins": {} {noformat} and cordova build android will work just fine. So the problem here seems to be that if a dependent plugin was added manually, it will be added under installed_plugins and not dependent_plugins. Later when the consuming plugin is deleted, the tools delete the plugin code from the workspace but are not able to remove this plugin from the installed_plugins entry (presumably because it searches in the dependent_plugin object.) This leaves the project in a broken state because *plugin ls* does not show the installed plugin, but the tools will try to copy the file at MyApp/plugins/org.apache.cordova.****, whatever is listed in plugins/android.json file. I think the fix would be: When doing plugin uninstall, only remove plugins from the workspace if: 1) the plugin is detected to be a dependent plugin, (already being done since *cordova plugin rm org.apache.cordova.file-transfer removes the org.apache.cordova.file code) and 2. the plugin is listed in "dependent_plugins" section of /plugins/platform.json -- This message was sent by Atlassian JIRA (v6.1#6144)