在钩子文件夹中使用节点脚本时出现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

安装 fcm 插件时出现cordova错误

生成 apk 时出现 Cordova-plugin-file 错误

Apache Cordova 本地通知插件图标

在 Cordova 上将 AngularJS webapp 构建到 android 时出现问题