Własna komenda drush w Drupal 8
W Drupalu 8 w bardzo prosty sposób możemy dodać własną komendę do Drush. Cały kod nowej komendy zawarty będzie w customowym module. Każda drupalowa agencja lub każdy kto zajmuje się Drupal developmentem używa Drush, ponieważ dzięki temu można zaoszczędzić czas i pieniądze.
Musimy stworzyć tylko 2 pliki.
Struktura wygląda następująco.
Plik d_drush_command_pack.info.yml
Standardowy plik każdego modułu, w którym mieszczą się informacje dotyczące naszej wtyczki.
name: Droptica Drush Command Pack
description: Provide useful custom drush commands
package: Drush Commands
type: module
core: 8.x
Plik d_drush_command_pack.drush.inc
Tutaj definiujemy nasze komendy oraz umieszczamy logikę, którą dana komenda będzie wykonywała.
Poniższy przykład tworzy dwie nowe komendy.
<?php
/**
* Implements hook_drush_command().
*/
function d_drush_command_pack_drush_command() {
$commands['rebuild-aggregate-file'] = [
'description' => 'Rebuild aggregate css/js files',
'aliases' => ['raf'],
'arguments' => [
'js' => 'Rebuild aggregate js files only',
'css' => 'Rebuild aggregate css files only',
],
'examples' => [
'drush raf' => 'Rebuild aggregate css/js files',
'drush raf js' => 'Rebuild aggregate js files',
'drush raf css' => 'Rebuild aggregate css files',
],
];
$commands['delete-node-alias'] = [
'description' => 'Delete a node alias',
'aliases' => ['dna'],
'arguments' => [
'source' => 'Delete by source',
'alias' => 'Delete by alias',
],
'options' => [
'name' => 'Name of source or alias',
],
'examples' => [
'drush dna source /node/1' => 'Delete an alias by source path',
'drush dna alias /path-alias-name' => 'Delete an alias by alias path name',
],
];
return $commands;
}
/**
* Drush command logic for rebuilding file cache.
*
*/
function drush_d_drush_command_pack_rebuild_aggregate_file($arg = NULL) {
$tokens = ['@arg' => $arg];
switch ($arg) {
case 'js':
\Drupal::service("asset.js.collection_optimizer")->deleteAll();
_drupal_flush_css_js();
drush_print(dt('Rebuild aggregate @arg files.', $tokens));
break;
case 'css':
\Drupal::service("asset.css.collection_optimizer")->deleteAll();
_drupal_flush_css_js();
drush_print(dt('Rebuild aggregate @arg files.', $tokens));
break;
case '':
\Drupal::service("asset.css.collection_optimizer")->deleteAll();
\Drupal::service("asset.js.collection_optimizer")->deleteAll();
_drupal_flush_css_js();
drush_print(dt('Rebuild aggregate js/css files.'));
break;
default:
drush_print(dt('Wrong argument. Possible arguments: js, css or use command without argument.'));
}
}
/**
* Drush command logic for deleting aliases
*
*/
function drush_d_drush_command_pack_delete_node_alias($arg = NULL, $opt = NULL) {
$tokens = ['@arg' => $arg, '@opt' => $opt];
switch ($arg) {
case 'alias':
case 'source':
$condition = [$arg => $opt];
\Drupal::service('path.alias_storage')
->delete($condition);
drush_print(dt('Alias @opt deleted', $tokens));
break;
default:
drush_print(dt('Wrong argument and options. Example use: drush dna source /node/1'));
}
}
Powyższy kod tworzy nam dwie nowe komendy do drush’a
Pierwsza to rebuild-aggregate-file
Druga to delete-node-alias
Komendy zdefiniowane są w hooku hook_drush_command(), w którym ustalamy alias, argumenty, opcje oraz przykłady dla naszej komendy.
Logika dla każdej z nich tworzona jest w osobnych funkcjach.
Nazwy funkcji tworzymy w sposób:
drush_[MODULE_NAME]_[COMMAND_NAME]()
Wystarczy włączyć nasz nowy moduł, wyczyścić cache i przetestować komendy.
Przykłady odpalenia komend z powyższego kodu.
drush rebuild-aggregate-file css
drush raf js
drush raf
drush dna source /node/1
drush dna alias /alias-name