Spec-Zone.ru › Cordova 9

Плагины

Введение

Плагины 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 prepare
cordova platform add
cordova build
cordova run
Выполняется перед и после подготовки вашего приложения.
after_prepare
before_compile cordova compile
cordova build
Выполняется перед и после компиляции вашего приложения.
after_compile
before_deploy cordova emulate
cordova 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
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_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/android/appAndroidBeforeBuild.bat" />
    <hook type="before_build" src="scripts/android/appAndroidBeforeBuild.js" />
    <hook type="before_plugin_install" src="scripts/android/appAndroidBeforePluginInstall.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

Интерфейс скрипта

JavaScript

Если вы пишете плагины с использованием Node.js, вы должны использовать следующую декларацию модуля:

module.exports = function(context) {
    ...
}

Вот пример, демонстрирующий содержимое объекта context.

{
  // The type of hook being run
  hook: 'before_plugin_install',

  // Absolute path to the hook script that is currently executing
  scriptLocation: '/foo/scripts/appBeforePluginInstall.js',

  // The CLI command that lead to this hook being executed
  cmdLine: 'cordova plugin add plugin-withhooks',

  // The options associated with the current operation.
  // WARNING: The contents of this object vary among the different
  // operations and are currently not documented anywhere.
  opts: {
    projectRoot: '/foo',

    cordova: {
      platforms: ['android'],
      plugins: ['plugin-withhooks'],
      version: '0.21.7-dev'
    },

    // Information about the plugin currently operated on.
    // This object will only be passed to plugin hooks scripts.
    plugin: {
      id: 'plugin-withhooks',
      pluginInfo: { /* ... */ },
      platform: 'android',
      dir: '/foo/plugins/plugin-withhooks'
    }
  },

  // A reference to Cordova's API
  cordova: { /* ... */ }
}

Вы также можете загрузить дополнительные модули Cordova в свой скрипт, используя context.requireCordovaModule следующим образом:

const cordovaCommon = context.requireCordovaModule('cordova-common');

Вы можете сделать свои скрипты асинхронными, используя Promises. Вот пример, который просто ждёт секунду, а затем выводит количество миллисекунд, потраченных на ожидание:

module.exports = context => {
    return new Promise(resolve => {
        const start = Date.now();
        setTimeout(() => resolve(Date.now() - start), 1000);
    }).then(msWaited => {
        console.log(`${context.scriptLocation} waited ${msWaited} ms`);
    });
};

Примечание: новый интерфейс загрузчика модулей используется для файлов .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» выше.

Особенности Windows

Если вы работаете в Windows, а ваши скрипты плагинов не являются файлами *.bat, Cordova CLI ожидает строку shebang в первой строке скрипта. Таким образом, он знает интерпретатор, который нужно использовать для запуска скрипта. Строка shebang для скрипта Python может выглядеть так:

#!/usr/bin/env python

Пример использования

Этот пример демонстрирует использование плагинов Cordova для вывода в консоль размера сгенерированного файла .apk для платформы Android.

Создайте пустое приложение Cordova и добавьте следующее определение в config.xml, чтобы указать Cordova запустить скрипт afterBuild.js после каждой сборки платформы.

<hook type="after_build" src="scripts/afterBuild.js" />

Создайте scripts/afterBuild.js файл и добавьте следующее реализацию. Мы используем асинхронную версию fs.stat метода, чтобы продемонстрировать, как асинхронные функции могут быть использованы в хуках.

const fs = require('fs');
const util = require('util');
const stat = util.promisify(fs.stat);

module.exports = function(ctx) {
    // Make sure android platform is part of build
    if (!ctx.opts.platforms.includes('android')) return;

    const platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
    const apkFileLocation = path.join(platformRoot, 'build/outputs/apk/android-debug.apk');

    return stat(apkFileLocation).then(stats => {
      console.log(`Size of ${apkFileLocation} is ${stats.size} bytes`);
    });
};

Параметр 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 Phone Gap

© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/9.x/guide/appdev/hooks/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API