Создать новую команду drush очень легко. Для этого нужно выполнить 4 шага:
- Создать файл команды с именем в виде
COMMANDFILE.drush.inc. - Реализовать функцию
COMMANDFILE_drush_help()(опционально). - Реализовать функцию
COMMANDFILE_drush_command(). - Реализовать функции ассоциированные с вашими командами. Как правило это фунции вида
drush_COMMANDFILE_COMMANDNAME().
Пример готовой пользовательской команды с комментариями можно посмотреть в файле examples/sandwich.drush.inc.
Подробнее о каждом шаге читаем ниже.
Создание COMMANDFILE.drush.inc
Имя файла, в котором будет код ваших команд, очень важно. Оно должно заканчиваться на .drush.inc. Всё что идёт до .drush.inc станет системным именем по аналогии с именами модулей. В одном таком файле может быть несколько пользовательских команд.
Например такие команды как pm-enable, pm-disable и pm-info находятся в файле под общим именем pm.drush.inc.
Drush ищет файлы команд в следующих местах:
- В папке
/path/to/drush/commands. - В папках перечисленных в опции
include(подробности по командеdrush topic docs-configuration). - В общей системной папке drush, например
/usr/share/drush/commands. - В папке
.drushдомашней директории текущего пользователя. - В модулях текущей установки Drupal.
Поэтому созданный файл нужно положить в одно из этих мест.
Здесь следует отметить, что поиск в модулях ведётся только если drush имеет уровень загрузки не ниже DRUSH_BOOSTRAP_SITE, в этом случаем поиск происходит во всех модулях, как включённых так и нет. Однако, как правило при работе с Drupal сайтом, уровень загрузки будет DRUSH_BOOTSTRAP_FULL, и поиск будет происходить уже в папках только включённых модулей. Подробнее смотрите по команде drush topic docs-bootstrap.
Реализация COMMANDFILE_drush_help()
COMMANDFILE_drush_help() это опциональный хук, в котором можно подробно описать одну или несколько команд. Если у команды есть только краткое описание, то этот хук можно опустить и указать описание только в COMMANDFILE_drush_command().
Пример реализации хука из файла examples/sandwich.drush.inc (в нём описывается команда make-me-a-sandwich):
function sandwich_drush_help($section) {
switch ($section) {
case 'drush:make-me-a-sandwich':
return dt('... brief help summary goes here ...');
}
}
Обратите внимание, что имя команды сопровождается префиксом drush:. Если в файле содержится несколько команд, то просто добавьте по оператору case на каждую из них.
Реализация COMMANDFILE_drush_command()
Хук COMMANDFILE_drush_command() является наиболее важной частью файла. Он возвращает массив элементов, которые определяют как работают ваши команды. Команды в drush очень похожи на систему меню в Drupal. Каждый элемент (команда) может содержать следующие свойства:
-
aliases — синонимы команды. У некоторых команд в drush есть синонимы, по которым их можно вызвать, например у команды
pm-downloadэтоdlи для того чтобы скачать модуль достаточно написатьdrush dl. -
deprecated-aliases — то же самое что
aliases, но не появляется в справке. Используется в тех случаях, когда синоним планируется убрать в будущем. При использовании такого синонима drush будет выводить предупреждение. -
command hook — изменяет название функции, которая будет вызвана для выполнения команды, с
drush_COMMANDFILE_COMMANDNAME()наdrush_COMMANDFILE_COMMANDHOOK(), гдеCOMMANDNAMEэто оригинальное название команды, аCOMMANDHOOK— значение свойстваcommand hook. -
callback — название функции для выполнения команды. Название должно начинаться с
drush_COMMANDFILE_. Это опциональный параметр и предпочтительно его опускать, чтобы drush сгенерировал имя функции самостоятельно в видеdrush_COMMANDFILE_COMMANDNAME(). -
callback arguments — массив аргументов для передачи в callback функцию. Если у команды есть аргументы описанные в
arguments, то аргументы изcallback argumentsбудут добавлены в конецarguments. Параметр используется довольно редко. -
description — описание команды.
-
arguments — массив аргументов, которые можно указывать при выполнении команды. Используется только в
drush help. -
options — массив опций, которые можно указывать при выполнении команды. Используется только в
drush help. -
examples — массив с примерами использования команды. Используется только в
drush help. -
bootstrap — уровень загрузки Drupal. Может принимать значения:
DRUSH_BOOTSTRAP_DRUSHDRUSH_BOOTSTRAP_DRUPAL_ROOTDRUSH_BOOTSTRAP_DRUPAL_SITEDRUSH_BOOTSTRAP_DRUPAL_CONFIGURATIONDRUSH_BOOTSTRAP_DRUPAL_DATABASEDRUSH_BOOTSTRAP_DRUPAL_FULLDRUSH_BOOTSTRAP_DRUPAL_LOGINDRUSH_BOOTSTRAP_MAX
Подробности по команде
drush topic docs-bootstrap. -
core — массив мажорных версий друпала, под которые написана команда. Например
array(6,7). -
drupal dependencies — модули друпала, от которых зависит работа команды. Например
array('search', 'simpletest'). -
drush dependencies — системные имена файлов команд, от которых зависит работа этой команды, без суффикса
.drush.inc. Напримерarray('sql', 'pm', 'core'). -
topics — список тем справки, которые связаны с командой. Например
array('docs-aliases', 'docs-policy'). Используется только вdrush help. -
topic — установите в
TRUE, если команда является темой в справке. Вызывается поdrush docs-topics.
Пример из файла examples/sandwich.drush.inc:
function sandwich_drush_command() {
$items['make-me-a-sandwich'] = array(
'description' => 'Makes a delicious sandwich.',
'arguments' => array(
'filling' => 'The type of the sandwich (turkey, cheese, etc.)',
),
'options' => array(
'spreads' => 'Comma delimited list of spreads (e.g. mayonnaise, mustard)',
),
'examples' => array(
'drush mmas turkey --spreads=ketchup,mustard' => 'Make a terrible-tasting sandwich that is lacking in pickles.',
),
'aliases' => array('mmas'),
'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
);
return $items;
}
Все параметры в этом примере, кроме aliases и bootstrap, не влияют на выполнение команды, а используются только при вызове справки с помощью drush help.
Реализация drush_COMMANDFILE_COMMANDNAME()
Вся логика работы команды находится в функции drush_COMMANDFILE_COMMANDNAME() (конечно если имя функции не изменено в COMMANDFILE_drush_command()), где COMMANDNAME это имя команды, в котором знаки тире заменены на подчёркивания. Например функция для команды make-me-a-sandwich, которая определена в файле sandwich.drush.inc выглядит:
function drush_sandwich_make_me_a_sandwich($filling = 'ascii') {
// code
}
Если пользователь выполняет команду без аргументов — drush make-me-a-sandwich, то drush вызовет функцию drush_sandwich_make_me_a_sandwich() без каких либо параметров. В этом случае параметр $filling примет значение по умолчанию — ascii.
Соответственно при вызове drush make-me-a-sandwich ham, drush выполнит drush_sandwich_make_me_a_sandwich('ham').
Следует знать, что drush вызывает ещё некоторые функции до и после выполнения drush_COMMANDFILE_COMMANDNAME(). Одна из таких функций это хук validate. Пример из файла examples/sandwich.drush.inc:
function drush_sandwich_make_me_a_sandwich_validate() {
$name = posix_getpwuid(posix_geteuid());
if ($name['name'] !== 'root') {
return drush_set_error('MAKE_IT_YOUSELF', dt('What? Make your own sandwich.'));
}
}
Подробнее смотрите по drush topic docs-policy и drush topic docs-api.
Это перевод официальной документации.
Пример
Простейший пример пользовательской команды echo, которая просто выводит на экран введённый аргумент:
<?php // commands/my/echo.drush.inc
function echo_drush_command() {
$items['echo'] = array(
'description' => 'Output some text',
'arguments' => array('text' => 'Some text'),
'examples' => array('drush echo hello' => 'Output "hello"'),
'callback' => 'drush_echo',
'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
);
return $items;
}
function drush_echo($text = '') {
drush_print($text);
}
?>
Видео:
— How to create a custom Drush command (eng).
— Создание собственных команд для Drush (rus).
Добавить комментарий