Problema de installation del complemento cordova cuando se usa el script de nodo en la carpeta de ganchos

Cordova 3.4 hooks no está instalando plugins mencionados correctamente en iOS. Estoy agregando install_plugins.js en la carpeta project/project_root/hooks/after_platform_add que tiene el siguiente código:

 #!/usr/bin/env node //this hook installs all your plugins // add your plugins to this list--either the identifier, the filesystem location or the URL // It can also be git url like "https://github.com/chrisekelley/AppPreferences/" var pluginlist = [ "org.apache.cordova.camera", "org.apache.cordova.console", "org.apache.cordova.contacts", "org.apache.cordova.device", "org.apache.cordova.dialogs", "org.apache.cordova.file", "org.apache.cordova.file-transfer", "org.apache.cordova.geolocation", "org.apache.cordova.globalization", "org.apache.cordova.media", "org.apache.cordova.media-capture", "org.apache.cordova.network-information", "org.apache.cordova.splashscreen", "org.apache.cordova.statusbar" ]; // no need to configure below var fs = require('fs'); var path = require('path'); var sys = require('sys') var exec = require('child_process').exec; function puts(error, stdout, stderr) { sys.puts(stdout) } pluginlist.forEach(function(plug) { exec("cordova plugin add " + plug, puts); }); 

así que cuando agrego plataforma con command cordova platform add ios , todos los complementos se instalan correctamente.

Después de comstackr el proyecto utilizando el command cordova build ios ** BUILD SUCCEEDED ** logging como ** BUILD SUCCEEDED **

Pero cuando ejecuto mi proyecto en Xcode obtengo el siguiente error

 2014-07-22 11:42:00.960 Totter[2788:90b] CDVPlugin class CDVDevice (pluginName: Device) does not exist. 2014-07-22 11:42:00.961 Totter[2788:90b] ERROR: Plugin 'Device' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml. 2014-07-22 11:42:00.963 Totter[2788:90b] -[CDVCommandQueue executePending] [Line 158] FAILED pluginJSON = [ "Device1460086973", "Device", "getDeviceInfo", [ ] ] 2014-07-22 11:42:00.964 Totter[2788:90b] CDVPlugin class CDVConnection (pluginName: NetworkStatus) does not exist. 2014-07-22 11:42:00.965 Totter[2788:90b] ERROR: Plugin 'NetworkStatus' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml. 2014-07-22 11:42:00.965 Totter[2788:90b] -[CDVCommandQueue executePending] [Line 158] FAILED pluginJSON = [ "NetworkStatus1460086974", "NetworkStatus", "getConnectionInfo", [ ] ] 

Por favor, ayúdame a resolver este problema

Este problema me mordió el trasero también, pero finalmente encontré una solución; Aquí está el trato. El problema es que node.js ejecuta commands de forma asíncrona de forma pnetworkingeterminada. ¡Ideal para serveres web, no tanto para scripts de shell! Así que cuando está emitiendo los commands de "cordova plugin add [your plugin]" uno tras otro, está terminando con un grupo de ellos ejecutándose simultáneamente y se están pisando uno al otro mientras se repite sobre la list de complementos instalados y reescribiendo el file (cordova_plugins.js). De hecho, puede ver que eso sucede si agrega el conmutador "–verbose" a su command (por lo que "cordova plugin add [su complemento] –verbose". Node.js no obtuvo la capacidad de ejecutar commands sincrónicamente hasta 0.12 (es el command execSync), y al momento de escribir esto, la última versión estable es 0.10. Si está trabajando con Cordova en 2015, es probable que tenga 0.10, por lo que necesitará instalar un package como shelljs o exec-sync para get esa funcionalidad. Entonces, usando shelljs, en la línea de command:

 [sudo] npm install shelljs 

Y en su script de enlace, reemplace todo esto:

 // no need to configure below var fs = require('fs'); var path = require('path'); var sys = require('sys') var exec = require('child_process').exec; function puts(error, stdout, stderr) { sys.puts(stdout) } pluginlist.forEach(function(plug) { exec("cordova plugin add " + plug, puts); }); 

Con este:

 var execSync = require("shelljs").exec; pluginlist.forEach(function(plugin) { execSync("cordova plugin add " + plugin + " --verbose"); }); 

Ahora que execSync está disponible en los últimos nodejs estables (v0.12.4 a partir de la escritura), puede hacer esto en su gancho:

 var execSync = require('child_process').execSync; execSync("cordova plugin add " + plugin)