Wie kann ich den Namen eines benutzerdefinierten Drush-Befehls anpassen?

7

Ich habe die interessante Antwort auf die Frage " Wie kann ich mit drush eine Liste von Inhaltstypen erhalten? " Gesehen , die wie folgt beginnt:

Sie können einen Drush-Befehl mit dem Namen erstellen content-type-list.

Aber ich frage mich, wie es aussehen sollte, wenn der Befehl einen anderen Namen haben sollte, z. B. mijn-contenttypes-lijst(anstelle von content-type-list), und drush drush mcl(anstelle von drush ctl) verwenden sollte.

Einige Gründe, warum ich möglicherweise einen anderen Namen verwenden möchte:

  • Weil es mit etwas anderem in Drupal in Konflikt steht, für das ich bereits verwendet habe content-type-listund / oder ctl.
  • Der Befehl ist schwer zu merken (z. B. weil er nicht in meiner Muttersprache ist), daher möchte ich ihn an einen anderen Namen anpassen.

Was genau müsste ich an dem in dieser Antwort enthaltenen Code ändern, der derzeit so aussieht:

<?php
/**
 * @file
 * Drush commands related to Content Types.
 */

/**
* Implements hook_drush_command().
*/
function drush_content_types_drush_command() {
  $items['content-type-list'] = array(
    'description' => dt("Show a list of available content types."),
    'aliases' => array('ctl'),
  );
  return $items;
}

/**
 * Callback for the content-type-list command.
 */
function drush_drush_content_types_content_type_list() {
  $content_types = array_keys(node_type_get_types());
  sort($content_types);

  drush_print(dt("Machine name"));
  drush_print(implode("\r\n", $content_types));
}

PS: Ich verstehe, dass ich auch Aliase dafür erstellen kann (wie in der verknüpften Antwort gezeigt), aber darum geht es in meiner Frage nicht. ZB wenn ich einen Befehl will, der etwas anderes macht.

Pierre.Vriens
quelle

Antworten:

6

Mit dem Code in meiner Antwort auf " Wie kann ich mit drush eine Liste von Inhaltstypen erhalten? " Können Sie Folgendes tun:

Der Name Ihrer Datei lautet MY_MODULE_NAME.drush.inc

<?php
/**
 * @file
 * Drush commands related to Content Types.
 */

/**
* Implements hook_drush_command().
*/
function MY_MODULE_NAME_drush_command() {
  $items['MY-DRUSH-CMD'] = array(
    'description' => dt("Show a list of available content types."),
    'aliases' => array('MD-CMD', 'another-alias', 'and-other'),
  );
  return $items;
}

/**
 * Callback for the MY-DRUSH-CMD command.
 * See here that you must change the - by a _
 * (MY-DRUSH-CMD by MY_DRUSH_CMD) in the callback function
 */
function drush_MY_MODULE_NAME_MY_DRUSH_CMD() {
  $VAR = array_keys(node_type_get_types());
  sort($VAR);

  drush_print(dt("Machine name"));
  drush_print(implode("\r\n", $VAR));
}

Im Aliase-Array können Sie weitere Aliase hinzufügen.

Installieren Sie das Modul, führen Sie es aus drush cc drush, um den Drush-Cache zu löschen, und verwenden Sie den folgenden Befehl:

Sie können verwenden:

drush MY-DRUSH-CMD
drush MD-CMD
drush another-alias
drush and-other

Verweise:

Adrian Cid Almaguer
quelle
Hm, das sieht aus wie eine Antwort eines Lehrers (mit Großbuchstaben usw.), die schwer zu verstehen ist. Ich habe jedoch noch 1 kleine Neugierde (damit es vollständig mit meinen "contenttypes" entspricht, die Ihren ursprünglichen "content_types" entsprechen: Würden Sie zustimmen, dass ich die 3 Vorkommen von "content_types" in Ihrer Antwort auf "contenttypes" sicher ändern kann? Extra Neugier: Ist $ conten_type (als variabe naem) beabsichtigt (um Konflikte zu vermeiden) oder nur ein Tippfehler?
Pierre.Vriens
@ Pierre.Vriens Ich habe einige Änderungen vorgenommen, um die Antwort besser zu erklären, einen Blick darauf zu werfen und mir zu sagen, wenn Sie andere Fragen haben
Adrian Cid Almaguer
7

Sie müssten ein paar Dinge ändern:

/**
 * Implements hook_drush_command().
 */
function drush_content_types_drush_command() {
  $items['mijn-contenttypes-lijst'] = array(
    'description' => dt("Show a list of available content types."),
    'aliases' => array('mcl'),
  );
  return $items;
}

Der Array-Schlüssel unter $ items und der Wert für "Aliase" unter diesem Bedarf wurden geändert. Der Array-Schlüssel wird verwendet, um den Rückruf zu identifizieren, der bei Verwendung des Befehls drush oder des Alias ​​aufgerufen werden soll. Der Rückruf beginnt aus irgendeinem Grund nicht mit dem Präfix der Befehlsdatei, sondern mit "drush" und dann mit dem Präfix der Befehlsdatei und dem oben aufgeführten Array-Schlüssel, wobei die Bindestriche durch Unterstriche ersetzt werden. Die zweite (Rückruf-) Funktion würde also so aussehen ...

/**
 * Callback for the content-type-list command.
 */
function drush_drush_content_types_mijn_contenttypes_lijst() {
  $content_types = array_keys(node_type_get_types());
  sort($content_types);

  drush_print(dt("Machine name"));
  drush_print(implode("\r\n", $content_types));
}

Wenn Sie diese Änderungen vornehmen, erhalten Sie das, was Sie möchten. Weitere Informationen zum Erstellen eigener Drush-Befehle finden Sie hier: Command Authoring

Alex Finnarn
quelle
Schön, merci! Mir ist klar, dass es nur in einem Kommentar steht, aber um konsistent zu sein, bin ich mir sicher, dass "Rückruf für den Befehl content-type-list". sollte "Rückruf für den Befehl mijn-contenttypes-lijst" sein. Nein? Was ist auch mit dem Teil "content_types" im ersten Funktionsnamen?
Pierre.Vriens
Ja, Sie sollten die von Ihnen erwähnten Änderungen vornehmen. Ich habe die Kommentare einfach verpasst, weil diese Teile ohne Fehler dupliziert werden können. Sie können sogar mehr Kontext zu dem hinzufügen, was die Funktion in den Kommentaren tut.
Alex Finnarn
4

Siehe auch den drushify Befehl auf drupal.org.

drushify ist ein einfacher Codegenerator, der eine Drush-Befehlsdateivorlage für das von Ihnen angegebene Modul erstellt.

Installation

drush dl drushify

Verwendungszweck

drush @site drushify modulename
greg_1_anderson
quelle
Danke Greg, ich wusste nichts davon. Gibt es jedoch ein Dokument zu diesem Modul (README.txt hilft nicht und es gibt keine "Dokumentation lesen" auf der Projektseite). Kennen Sie einen Link, der zeigt, wie dieser generierte Code aussieht?
Pierre.Vriens
Die von Drushify verwendete Vorlagendatei befindet sich hier: cgit.drupalcode.org/drushify/tree/templates/commandfile.tmpl . Laden Sie es einfach per README herunter und führen Sie es aus, um die Ausgabe anzuzeigen.
Greg_1_anderson
Ich habe mir diese Vorlage bereits angesehen, aber wenn Sie jemandem dies beibringen, ist dies kein ideales Beispiel. Deshalb habe ich nach "generiertem Code" gefragt. Die Installation des Modues ist natürlich ziemlich vorwärts (Standard), aber " laut README" (unter cgit.drupalcode.org/drushify/tree/README.txt I asume) ist nicht offensichtlich (1 Inhaltszeile ). Ich werde später noch ein paar Hausaufgaben machen.
Pierre.Vriens
3

... Vorab sage ich, dass Ihre Frage wirklich so klingt, als ob Sie ein Alais erstellen sollten. Da Sie jedoch explizit fragen, wie Sie Ihren eigenen brandneuen Befehl mit einem neuen Namen erstellen können, können Sie Folgendes tun:

Sie müssen den Array-Schlüssel in der Funktion hook_drush_command sowie den Namen der Rückruffunktion ändern. Sie können eine Datei mit dem Namen drush_foo erstellen und beliebige Befehle definieren. Beachten Sie, dass der Array-Schlüssel der Funktion hook_drush_command mit dem Namen der Rückruffunktion identisch ist (außer dass Bindestriche durch Unterstriche ersetzt werden). Versuchen Sie so etwas:

<?php
/**
 * @file
 * Drush commands related to [insert description here].
 */

/**
* Implements hook_drush_command().
*/
function drush_foo_drush_command() {
  $items['mijn-contenttypes-lijst'] = array(
    'description' => dt("Do something awesome"),
    'aliases' => array('mcl'),
  );
  return $items;
}

/**
 * Callback for the mijn-contenttypes-lijst command.
 * Notice that this function name ends with mijn-contenttypes-lijst
 * except hyphens are replaced with underscores.
 */
function drush_drush_foo_mijn_contenttypes_lijst() {
  // Do something amazing (or call some other existing drush callback function)
}

Vergessen Sie auch nicht, dass Sie beim Hinzufügen (oder Ändern) eines Drush-Befehls IMMER ausführen sollten, drush cc drushdamit Drush seinen eigenen Cache leeren und feststellen kann, dass ein neuer Befehl vorhanden ist

bluten
quelle
Wenn ich einen Alias ​​für "Inhaltstyp-Liste" erstellen würde und davon ausgehen würde, dass ich bereits eine "Inhaltstyp-Liste" habe (was etwas völlig anderes bewirkt), dann denke ich, dass das Erstellen eines Alias genau dasselbe tun wird. " völlig anders "(anstelle dessen, was ich von meinem" mijn-contenttypes-lijst "cmd erwarten würde). Oder fehlt mir noch etwas? Wenn der Name meines Moduls "foo" wäre, was hook_drush_command implementiert, warum ist der Name der ersten Funktion dann nicht einfach foo_drush_command? Benötigt drush "drush_" am Anfang des ersten Funktionsnamens?
Pierre.Vriens
Sie haben richtig angegeben, dass Sie keinen Alias ​​verwenden sollten, wenn Sie einen Befehl wünschen, der etwas anderes ausführt ... aber Ihre Frage war etwas mehrdeutig. Sieht aus wie @adrian und ich gab Ihnen im Wesentlichen die gleiche Antwort, so sollten Sie gut sein, um zu gehen
bleen