Text "Drush" visible on the background made from drush screenshot

Własna komenda drush w Drupal 8

27.03.2017

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.

Musimy stworzyć tylko 2 pliki.

Struktura wygląda następująco.

The picture shows structure as a catalog tree: Custom/d_drush_command_pack/d_drush_command_pack.drush.inc and d_drush_command_pack.info.yml

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

Pliki przykładowego modułu znajdziesz na stronie GitHub.

Porozmawiajmy o Twoich projektach

Napisz do nas!