Вы здесь

Программируем на Drush

Вдохновившись вопросом про drush_invoke(), решила поделиться своим опытом написания Drush-скриптов.

Куда писать код

В первую очередь в YOURCOMMAND.d7.drush.inc. Этот файл можно разместить в папках drush или sites/all/drush вашего сайта, в любом модуле, в папке ~/.drush и ещё в паре мест в системе. Скелет этого файла можно сгенерировать командой dcg generate:other:drush.

Если задача на один раз и полноценная команда не нужна, то можно обойтись простым php-файлом и запускать его с помощью php-script. Код, написанный для php-script, ничем не отличается от кода команды.

> drush scr ~/.drush/scripts/sitename.php --uppercase

Никаких хуков, никаких инклудов. Сразу решаем задачу:

<?php
// Используем Drupal API (должен работать друпал).
$sitename = variable_get('site_name');

// Используем Drush API, чтобы получить опцию.
if (drush_get_option('uppercase')) {
  $sitename = drupal_strtoupper($sitename);
}
drush_log($sitename, 'ok');

Как вывести текст на экран

drush_log($message, $type)

$type может быть любой, но обычно используют эти:
- error, failed — красненький
- warning — желтенький
- ok, success —зелёненький
- notice — невидимый зелёненький (теперь вы эксперт!)

drush_set_error($code, $message)

Ошибку лучше устанавливать с помощью специальной команды.

drush_print_r($array)

Печать массивов. Выручает при отладке.

drush_print_table($rows)

Можно напечатать таблицу, как в drush up.

Как спросить пользователя

drush_confirm($message)

Да или нет. Как вы знаете, можно перехитрить, передав опцию -y.

drush_choice(array('left' => dt('Left'), 'right' => dt('Right')), $message)

Выбор из списка. Можно перехитрить, передав --choice=right.
Для множественного выбора есть drush_choice_multiple().

drush_prompt($message)

Строка. Четвёртым параметром можно включить режим ввода пароля.

Аргументы и опции

Опцию вы уже видели: drush_get_option('uppercase').

Аргументы — это те, что без минусов.

drush_print_r(drush_get_arguments());

Выполнение других Drush-команд

Часто скрипт нужен, чтобы просто скомпоновать пачку уже существующих команд, а bash для этого дела уродлив.

drush_invoke_process()

Проверяем обновления безопасности:

$return = drush_invoke_process('@self', 'pm-updatestatus', $projects, array('security-only' => drush_get_option('security-only')), FALSE);

Аргументы и опции передаются явно третьим и четвёртым параметрами. Есть страшный пятый параметр, который имеет целых 11 строковых ключей, ни одним из которых я никогда не пользовалась.
В $return будет большой массив с результатами работы команды.

drush_invoke($command, $arguments)

Команда будет выполняться в том же процессе, в том же контексте (некий глобальный объект драша) и с теми же опциями. Возвращает когда что.
Я стараюсь не использовать.

Кроме команд есть ещё огромная кодовая база драша. Вот несколько полезных функций навскидку: drush_download_file(), drush_move_dir(), drush_tarball_extract().

Запуск системных команд

Ограничиваться драшем необязательно. Вся оболочка к вашим услугам:

// Получить размер директории с помощью Disk-Usage
if (drush_shell_exec('which du')) {
  drush_shell_exec("du -cksh %s", $folber);
  $return = drush_shell_exec_output();
  if (isset($return[1]) && preg_match('/(\w+)\stotal/', $return[1], $matches)) {
    drush_log(dt('Folder size: @size.', array('@size' => $matches[1])), 'ok');
  }
}

Когда не спасает drush_print_r.

Про отладку в PhpStorm хорошо написано у луллаботов: https://www.lullabot.com/articles/debugging-drush-commands-with-xdebug-a...
Они же выложили скрипт запуска удалённой отладки для шторма. Я пользуюсь связкой PhpStorm + DrupalVM и легко могу ответить на вопросы по ней (если у вас вдруг есть).

Полезные ссылки

P.S. Возвращаясь к вопросу из начала статьи, shell_exec — вполне рабочий антипатерн. Думаю, как прикрутить Drush к холодильнику.

8
4
02.08.2015 - 23:52

Комментарии

Аватар пользователя Chi
Chi – 03.08.2015 - 00:23

а bash для этого дела уродлив.

Почему?

Аватар пользователя Kate
kalabro – 03.08.2015 - 10:12

Субъективное суждение. Написать оператор ветвления на баше у меня занимает 2 часа :)

Аватар пользователя Seryak
Seryak – 03.08.2015 - 06:14

Спасибо за статью !