在钩子文件夹中使用节点脚本时出现cordova插件安装问题
Posted
技术标签:
【中文标题】在钩子文件夹中使用节点脚本时出现cordova插件安装问题【英文标题】:cordova plugin installation issue when using node script in hooks folder 【发布时间】:2014-07-22 06:18:01 【问题描述】:Cordova 3.4 hooks 没有在 ios 中正确安装提到的插件。我将install_plugins.js
添加到文件夹project/project_root/hooks/after_platform_add
中,其中包含以下代码:
#!/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);
);
所以当我使用命令cordova platform add ios
添加平台时,所有插件都已正确安装。
使用命令cordova build ios
构建项目后,日志将显示为** BUILD SUCCEEDED **
但是当我在 Xcode 中运行我的项目时出现以下错误
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",
[
]
]
请帮我解决这个问题
【问题讨论】:
您解决了这个问题吗?我有完全一样的问题。如果我遇到 RROR: Plugin 'NetworkStatus' not found,问题,我需要手动执行 'cordova plugin add org.apache.cordova.network-information' 我也尝试添加 【参考方案1】:这个问题也让我很头疼,但我终于找到了解决方案;这是交易。问题是 node.js 默认异步执行命令。非常适合 web 服务器,而不是 shell 脚本!因此,当您一个接一个地发出“cordova plugin add [your plugin]”命令时,您最终会得到一堆同时执行的命令,并且它们在迭代已安装插件列表时相互踩踏和重写文件(cordova_plugins.js)。如果您将“--verbose”开关添加到您的命令中,您实际上可以看到这种情况发生(因此“cordova plugin add [your plugin] --verbose”。Node.js 直到 0.12 才获得同步执行命令的能力(它是execSync 命令),在撰写本文时,最新的稳定版本是 0.10。如果您在 2015 年使用 Cordova,您很可能获得了 0.10,因此您需要安装 shelljs 或 exec-sync 之类的包才能获得那个功能。所以使用 shelljs,在命令行上你会:
[sudo] npm install shelljs
并在你的钩子脚本中替换所有这些:
// 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);
);
有了这个:
var execSync = require("shelljs").exec;
pluginlist.forEach(function(plugin)
execSync("cordova plugin add " + plugin + " --verbose");
);
【讨论】:
【参考方案2】:现在 execSync 在最新的稳定 nodejs 中可用(写作时为 v0.12.4),您可以在您的钩子中执行此操作:
var execSync = require('child_process').execSync;
execSync("cordova plugin add " + plugin)
【讨论】:
以上是关于在钩子文件夹中使用节点脚本时出现cordova插件安装问题的主要内容,如果未能解决你的问题,请参考以下文章
Oracle MAF:使用 cordova 插件时出现部署错误
使用串行插件时出现 Ionic Capacitor Android 错误 - 连接到外部设备时出现 Cordova_not_available