Erstellen einer benutzerdefinierten wp-cli.phar mit eigenen Befehlen

Es gibt mehrere Wege um eigene WP-CLI-Befehle zu nutzen. Dieser Artikel zeigt, wie man in wenigen Schritten eine benutzerdefinierte wp-cli.phar erstellt, die die gewünschten Befehle integriert, die bspw. auf GitHub liegen. Dafür werden ein Shell- und ein PHP-Skript verwendet, die im gleichen Verzeichnis liegen. Diese findet man in diesem Repository.

Das Entwickeln eines eigenen WP-CLI-Befehls wird in diesem Artikel nicht behandelt.

PHP-Skript (make-custom-phar.php)

Das Repository wp-cli/wp-cli-bundle liefert alles mit, um eine Phar-Datei für die offizielle WP-CLI zu bauen. Im Ordner utils/ liegt eine Datei namens make-phar.php. Diese erzeugt die wp-cli.phar im Hauptverzeichnis. Sie wird in den GitHub-Actions des Repositories mit folgendem Befehl aufgerufen:

php -dphar.readonly=0 utils/make-phar.php wp-cli.phar --version=$CLI_VERSION

Ist die Phar-Datei gebaut, kann man weitere Dateien hinzufügen, welche für die eigenen Befehle notwendig sind. Das nachfolgende Skript nutzt die make-phar.php, baut damit die wp-cli.phar, findet die gewünschten Dateien und fügt diese der Phar-Datei hinzu.

<?php // make-phar.php einbinden und wp-cli.phar bauen require 'make-phar.php'; // Dateien finden, die hinzugefügt werden sollen use Symfony\Component\Finder\Finder; $finder = new Finder(); $finder ->files() ->ignoreVCS( true ) ->name( '/\.*.php8?/' ) ->in( WP_CLI_VENDOR_DIR . '/angelocali' ) ->notName( 'behat-tags.php' ) ->notPath( '#(?:[^/]+-command|php-cli-tools)/vendor/#' ) ->exclude( 'config' ) ->exclude( 'debug' ) ->exclude( 'dependency-injection' ) ->exclude( 'event-dispatcher' ) ->exclude( 'translation' ) ->exclude( 'yaml' ) ->exclude( 'examples' ) ->exclude( 'features' ) ->exclude( 'test' ) ->exclude( 'tests' ) ->exclude( 'Test' ) ->exclude( 'Tests' ); // Dateien hinzufügen foreach ( $finder as $file ) { add_file( $phar, $file ); } // Optional: Ausgabe hinzufügen if ( ! BE_QUIET ) { echo "Added Custom Commands\n"; }
Code-Sprache: PHP (php)

In Zeile 14 ist die Angabe des Verzeichnisses, in dem der eigene Befehl liegt. Falls der Befehl Abhängigkeiten zu Bibliotheken hat, werden diese auch auf diese Weise hinzugefügt. Es ist empfehlenswert sich bei der Erweiterung des Skripts an der make-phar.php zu orientieren.

Die Verwendung der Finder-Klasse ist optional. Sie wurde hier der Einfachheit verwendet, weil diese auch in der make-phar.php genutzt wird.

Damit sind die Vorbereitungen getroffen, um mit dem Build-Skript eine benutzerdefinierte Phar-Datei zu bauen.

Build-Skript (build-script.sh)

Zusammengefasst lädt das Build-Skript das wp-cli/wp-cli-bundle-Repository herunter, konfiguriert das Composer-Projekt, lädt den eigenen Befehl herunter, kopiert die make-custom-phar.php an eine geeignete Stelle und führt den Befehl zur Erstellung der Phar-Datei in leicht abgewandelter Form aus. Die einzelnen Schritte sind im Code-Beispiel erklärt:

rm -rf wp-cli-bundle # wp-cli/wp-cli-bundle herunterladen composer create-project wp-cli/wp-cli-bundle # make-custom-phar.php in gewünschten # Ordner kopieren cp make-custom-phar.php wp-cli-bundle/utils/make-custom-phar.php cd wp-cli-bundle # Composer-Projekt konfigurieren für # require eines Custom Repos composer config repositories.hello-command vcs https://github.com/angelocali/hello-command.git rm composer.lock composer require "angelocali/hello-command" CLI_VERSION=$(head -n 1 vendor/wp-cli/wp-cli/VERSION) # Phar-Datei bauen php -dphar.readonly=0 utils/make-custom-phar.php wp-cli.phar --version=$CLI_VERSION
Code-Sprache: Bash (bash)

Nachdem die build-script.sh ausgeführt wurde, liegt die wp-cli.phar-Datei im wp-cli-bundle-Verzeichnis.

Damit ist mein erster Blog-Artikel verfasst. Ich freue mich über eure Kommentare.

Quellen

https://github.com/wp-cli/wp-cli-bundle
https://getcomposer.org/doc/03-cli.md#require
https://getcomposer.org/doc/03-cli.md#config
https://github.com/angelocali/build-custom-wp-cli-phar
https://github.com/angelocali/hello-command

Danksagungen

Vielen Dank an Matthias Pfefferle und Florian Brinkmann für die Inspiration zu dieser Lösung.

6 Kommentare

Reposts

  • Florian Brinkmann

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.