Плагины
Введение
Плагины Cordova представляют собой специальные скрипты, которые могут быть добавлены разработчиками приложений и плагинов, а также вашей собственной системой сборки для настройки команд cordova.
Плагины Cordova позволяют выполнять специальные действия вокруг команд cordova. Например, у вас может быть инструмент, который проверяет форматирование кода в вашем файле javascript. И вы хотите запустить этот инструмент перед каждой сборкой. В этом случае вы можете использовать плагин «before_build» и указать среде выполнения cordova запустить этот инструмент перед каждой сборкой.
Плагины могут быть связаны с вашими действиями по приложению, такими как before_build, after_build, и т.д. Или же они могут быть связаны с плагинами вашего приложения. Например, такие плагины, как before_plugin_add, after_plugin_add, и т.д., применяются к действиям, связанным с плагинами. Эти плагины могут быть связаны со всеми плагинами в вашем приложении или только с одним плагином.
Cordova поддерживает следующие типы плагинов:
| Тип плагина | Связанные команды Cordova | Описание |
|---|---|---|
| before_platform_add | cordova platform add | Выполняется перед и после добавления платформы. |
| after_platform_add | ||
| before_platform_rm | cordova platform rm | Выполняется перед и после удаления платформы. |
| after_platform_rm | ||
| before_platform_ls | cordova platform ls | Выполняется перед и после вывода списка установленных и доступных платформ. |
| after_platform_ls | ||
| before_prepare |
cordova preparecordova platform addcordova buildcordova run
| Выполняется перед и после подготовки вашего приложения. |
| after_prepare | ||
| before_compile |
cordova compilecordova build
| Выполняется перед и после компиляции вашего приложения. |
| after_compile | ||
| before_deploy |
cordova emulatecordova run
| Выполняется перед развертыванием вашего приложения. |
| before_build | cordova build | Выполняется перед и после сборки вашего приложения. |
| after_build | ||
| before_emulate | cordova emulate | Выполняется перед и после эмуляции вашего приложения. |
| after_emulate | ||
| before_run | cordova run | Выполняется перед и после запуска вашего приложения. |
| after_run | ||
| before_serve | cordova serve | Выполняется перед и после предоставления вашего приложения. |
| after_serve | ||
| before_clean | cordova clean | Выполняется перед и после очистки вашего приложения. |
| after_clean | ||
| pre_package | N/A | Применимо только к Windows 8 и Windows Phone. Этот плагин устарел. |
| before_plugin_add | cordova plugin add | Выполняется перед и после добавления плагина. |
| after_plugin_add | ||
| before_plugin_rm | cordova plugin rm | Выполняется перед и после удаления плагина. |
| after_plugin_rm | ||
| before_plugin_ls | cordova plugin ls | Выполняется перед и после вывода списка плагинов в вашем приложении. |
| after_plugin_ls | ||
| before_plugin_search | cordova plugin search | Выполняется перед и после поиска плагина. |
| after_plugin_search | ||
| before_plugin_install | cordova plugin add | Выполняется перед и после установки плагина (на платформы). Плагины плагинов в plugin.xml выполняются только при установке плагина. |
| after_plugin_install | ||
| before_plugin_uninstall | cordova plugin rm | Выполняется перед удалением плагина (с платформ). Плагины плагинов в plugin.xml выполняются только при установке плагина. |
Способы определения плагинов
Config.xml
Плагины могут быть определены в файле проекта config.xml с помощью элементов <hook>, например:
<hook type="before_build" src="scripts/appBeforeBuild.bat" />
<hook type="before_build" src="scripts/appBeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/appBeforePluginInstall.js" />
<platform name="android">
<hook type="before_build" src="scripts/wp8/appAndroidBeforeBuild.bat" />
<hook type="before_build" src="scripts/wp8/appAndroidBeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/wp8/appWP8BeforePluginInstall.js" />
...
</platform>
<platform name="windows">
<hook type="before_build" src="scripts/windows/appWinBeforeBuild.bat" />
<hook type="before_build" src="scripts/windows/appWinBeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/windows/appWinBeforePluginInstall.js" />
...
</platform>
Плагины (plugin.xml)
Как разработчик плагинов, вы можете определить скрипты плагинов, используя элементы <hook> в файле plugin.xml так:
<hook type="before_plugin_install" src="scripts/beforeInstall.js" />
<hook type="after_build" src="scripts/afterBuild.js" />
<platform name="android">
<hook type="before_plugin_install" src="scripts/androidBeforeInstall.js" />
<hook type="before_build" src="scripts/androidBeforeBuild.js" />
...
</platform>
before_plugin_install, after_plugin_install, before_plugin_uninstall плагины будут вызываться исключительно для установленного/удаленного плагина.
Папка /hooks (Устарело)
Для выполнения пользовательских действий при срабатывании соответствующего типа плагина используйте тип плагина в качестве имени подкаталога в каталоге 'hooks' и поместите ваш скрипт в него, например:
# script file will be automatically executed after each build hooks/after_build/after_build_custom_action.js
При использовании этих плагинов они всегда будут выполняться как исполняемые файлы, а не как загружаемые модули JavaScript.
Помните: сделайте ваши скрипты исполняемыми в этом случае.
Примечание: этот метод считается устаревшим в пользу элементов плагина в файлах config.xml и plugin.xml.
Порядок выполнения плагинов
Основанный на определении плагинов
Скрипты плагинов могут быть определены путём добавления их в специальную предопределённую папку (/hooks) или через конфигурационные файлы (config.xml и plugin.xml) и выполняются последовательно в следующем порядке:
- Плагины приложения из
/hooks; - Плагины приложения из
config.xml; - Плагины плагинов из
plugins/.../plugin.xml.
Основанный на внутреннем порядке выполнения
Внутренний порядок выполнения плагинов фиксирован.
Пример 1 (cordova platform add)
Если существуют плагины, связанные с before_platform_add, after_platform_add, before_prepare, after_prepare, before_plugin_install и after_plugin_install (и предполагая, что у вас установлен один плагин в вашем проекте), добавление новой платформы выполнит плагины в следующем порядке:
before_platform_add
before_prepare
after_prepare
before_plugin_install
after_plugin_install
after_platform_add
Пример 2 (cordova build)
Если существуют плагины, связанные с before_prepare, after_prepare, before_compile, after_compile, before_build и after_build - выполнение команды сборки выполнит плагины в следующем порядке:
before_build
before_prepare
after_prepare
before_compile
after_compile
after_build
Интерфейс скрипта
Особенности Windows
Если вы работаете в Windows, и в случае, если ваши скрипты плагинов (Javascript/Non-Javascript) не являются файлами bat (что рекомендуется, если вы хотите, чтобы ваши скрипты работали в не-Windows операционных системах), Cordova CLI будет ожидать строку shebang в первой строке, чтобы определить интерпретатор, который необходимо использовать для запуска скрипта. Строка shebang должна соответствовать следующему примеру:
#!/usr/bin/env [name_of_interpreter_executable]
Javascript
Если вы пишете плагины с использованием Node.js, вы должны использовать следующее определение модуля:
module.exports = function(context) {
...
}
Объект context содержит тип плагина, полный путь к исполняемому скрипту, опции плагина, аргументы командной строки, переданные Cordova, и верхнеуровневый объект "cordova" следующего формата:
{
"hook": "before_plugin_install",
"scriptLocation": "c:\\script\\full\\path\\appBeforePluginInstall.js",
"cmdLine": "The\\exact\\command\\cordova\\run\\with arguments",
"opts": {
"projectRoot":"C:\\path\\to\\the\\project",
"cordova": {
"platforms": ["android"],
"plugins": ["plugin-withhooks"],
"version": "0.21.7-dev"
},
"plugin": {
"id": "plugin-withhooks",
"pluginInfo": {
...
},
"platform": "android",
"dir": "C:\\path\\to\\the\\project\\plugins\\plugin-withhooks"
}
},
"cordova": {...}
}
Объект context.opts.plugin будет передан только скриптам плагинов.
Вы также можете загрузить дополнительные модули Cordova в свой скрипт, используя context.requireCordovaModule следующим образом:
var Q = context.requireCordovaModule('q');
Вы можете сделать свои скрипты асинхронными, используя Q:
module.exports = function(context) {
var Q = context.requireCordovaModule('q');
var deferral = new Q.defer();
setTimeout(function(){
console.log('hook.js>> end');
deferral.resolve();
}, 1000);
return deferral.promise;
}
Примечание: новый интерфейс загрузчика модулей используется для файлов
.js, определенных черезconfig.xmlилиplugin.xml. По соображениям совместимости файлы плагинов, указанные через каталоги/hooks, запускаются через Node child_process spawn, см. раздел «Не-JavaScript» ниже.
Не-JavaScript
Скрипты, не являющиеся JavaScript, выполняются через Node child_process spawn из корневого каталога проекта, и корневой каталог передаётся в качестве первого аргумента. Все остальные параметры передаются в скрипт с помощью переменных среды:
| Имя переменной среды | Описание |
|---|---|
| CORDOVA_VERSION | Версия Cordova-CLI. |
| CORDOVA_PLATFORMS | Список платформ, к которым применяется команда (например: android, ios), разделенный запятыми. |
| CORDOVA_PLUGINS | Список идентификаторов плагинов, к которым применяется команда (например: cordova-plugin-file-transfer, cordova-plugin-file), разделенный запятыми. |
| CORDOVA_HOOK | Путь к плагину, который выполняется. |
| CORDOVA_CMDLINE | Точные аргументы командной строки, переданные cordova (например: cordova run ios --emulate). |
Если скрипт возвращает код выхода, отличный от нуля, то родительская команда Cordova будет прервана.
Примечание: настоятельно рекомендуется писать свои плагины с использованием Node.js, чтобы они были кроссплатформенными, см. раздел Javascript выше.
Пример использования
Этот пример демонстрирует использование плагинов Cordova для вывода в консоль размера сгенерированного файла .apk для платформы Android.
Создайте пустое приложение Cordova и добавьте следующее определение в config.xml , чтобы указать Cordova на выполнение скрипта afterBuild.js после каждой сборки платформы.
<hook type="after_build" src="scripts/afterBuild.js" />
Создайте файл scripts/afterBuild.js и добавьте следующее реализацию. Мы используем асинхронную версию метода fs.stat , чтобы продемонстрировать, как можно реализовать асинхронность через плагины.
module.exports = function(ctx) {
// make sure android platform is part of build
if (ctx.opts.platforms.indexOf('android') < 0) {
return;
}
var fs = ctx.requireCordovaModule('fs'),
path = ctx.requireCordovaModule('path'),
deferral = ctx.requireCordovaModule('q').defer();
var platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
var apkFileLocation = path.join(platformRoot, 'build/outputs/apk/android-debug.apk');
fs.stat(apkFileLocation, function(err,stats) {
if (err) {
deferral.reject('Operation failed');
} else {
console.log('Size of ' + apkFileLocation + ' is ' + stats.size +' bytes');
deferral.resolve();
}
});
return deferral.promise;
};
Параметр ctx в примере выше передаётся Cordova и представляет контекст выполнения, такой как полный путь к скрипту, целевая платформа, аргументы командной строки и т.д., а также предоставляет дополнительную вспомогательную функциональность. Подробнее см. раздел Script Interface выше.
Теперь можно добавить платформу Android и выполнить сборку.
cordova platform add android .. cordova build .. Size of path\to\app\platforms\android\build\outputs\apk\android-debug.apk is 1821193 bytes
Дополнительные примеры хорошего использования можно найти в Трех плагинах, необходимых для вашего проекта Cordova PhoneGap
© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/8.x/guide/appdev/hooks/index.html