WP-CLI と Robo を使用して WordPress 開発環境を管理する

公開: 2022-09-13

反復的なタスクを自動化することは、開発ワークフローの時間を節約する最良の方法の 1 つです。 プラグイン開発者としての日々の仕事では、データベースをリセットしたり、特定のバージョンの WordPress を再インストールしたり、1 つまたは複数のプラグインをインストールしたり、設定を更新したりしなければならないことがよくあります。 これはすぐに面倒になるため、自動化に適しています。 この記事では、WP-CLI を Robo と組み合わせて使用​​して、WordPress 開発環境の管理に必要なタスクを自動化する方法を紹介します。

WordPress コマンド ライン ツールである WP-CLI は、ワークフローを高速化するための優れた出発点です。 よく知らない場合は、私たちの多くのブログ投稿の 1 つを読むことを強くお勧めします。 私たちのインストール ガイドは、OS へのインストール方法、タブ補完の設定方法、および構成ファイルの作成方法を説明している優れた出発点です。

目次

  1. ロボとは?
    1. Robo はコマンド ライン PHP を簡素化します
    2. ロボのインストール
    3. あなたの最初のコマンド
    4. 入出力
    5. 素晴らしい助っ人
    6. ロボのメリット
  2. Robo で WordPress を維持する
    1. 重要なファイル
    2. 私の環境
    3. データベース ユーザー
    4. ウェブサーバー
    5. 依存関係の処理
  3. wp-cli.yml の活用
    1. WP-CLI のエイリアスとは?
    2. コマンドのデフォルト
  4. カスタム Robo コマンドの作成
    1. コマンド構成
    2. resetコマンド
    3. インストール後の手順
    4. profileコマンド
  5. まとめ

ロボとは?

Robo は、Drush や Codeception などの多くのプロジェクトで使用されているオープン ソースの最新のタスク ランナーです。

Robo は Gulp や Grunt に似ていますが、JavaScript ではなく PHP を使用しています。

アイデアは、次のような気の利いた小さなコマンドを作成できるということです。

# WP 開発環境をリセットしてマルチサイトにします
ロボリセット --マルチ

# WP Offload Media プラグインのインストールとセットアップ
ロボ プロファイル ome-dev

Robo タスク ランナーを使用すると、DocBlock コメントをコマンドに追加することで、作成したコマンドを簡単に文書化できるため、将来のバージョンのヘルプを提供できます。

# 引数なしの Robo は、使用可能なコマンドを表示します。
ロボ

利用可能なコマンド:
  help コマンドのヘルプを表示します
  list コマンドを一覧表示します
  profile 既存の WordPress 環境で一連の wp-cli コマンドを実行する
  リセット WordPress 環境を既知の状態にリセットします

特定のコマンドに関する詳細情報を求める:

ロボヘルプリセット

説明:
  WordPress 環境を既知の状態にリセットします。 環境と構成を読み取ります 
  robo.yml から

使用法:
  リセット [オプション]

オプション:
      --env[=ENV] 環境 (開発、テストなど) [デフォルト: "dev"]
      --multi マルチサイトインストールを行う
      --ver[=VER] WordPress のバージョン [デフォルト: 「最新」]

WordPress 開発環境を管理するために毎日使用する Robo でいくつかの強力なコマンドを作成しました。 この記事では、これらのコマンドを紹介し、途中で Robo コマンドを紹介します。

Robo はコマンド ライン PHP を簡素化します

バックミラーをちょっと確認してみましょう。 コマンドライン PHP コマンドを書くことは、確かに新しいことではありません。 次のように、コマンド ラインから PHP スクリプトを実行することは常に可能でした。

php myscript.php

PHP は、私が覚えている限り、ほとんどの *NIX 環境でコマンド ライン環境として使用できます。 PHP シバンを追加すると、PHP インタープリターがインストールされているほとんどの環境で機能します。

 // file: myscript #!/usr/bin/env php <?php // do stuff here…

これにより、PHP で解析する必要があることを指定 (または .php ファイル拡張子を含める) せずに、コマンド ラインからスクリプトを実行できます。

マイスクリプト

コマンド ラインから未加工の PHP スクリプトを実行することの欠点は、各スクリプトで処理する入力と出力のオーバーヘッドがかなり大きいことです。 コマンド ラインから引数を受け取り、メッセージをコマンド ラインに出力するプロセスは少し面倒で、あまり柔軟ではありません。

Robo は、ほとんどのスクリプトが必要とする多くの標準的な「配管」を処理することで、コマンド ライン PHP の記述を容易にすることに着手しています。 これにより、スクリプトのコア機能に集中できます。

ロボのインストール

始める前に、Robo をインストールする必要があります。 Robo を自分のマシンにグローバルにインストールしたままにしているので、次のようにインストールしました。

コンポーザー グローバルにはコンソリデーション/ロボが必要

しかし、Composer を介してインストールされたものと同様に、それがより快適であれば、プロジェクトの依存関係として保持することができます。 または、GitHub にrobo.pharをダウンロードしてインストールする手順があります。

あなたの最初のコマンド

まず、プロジェクト フォルダーで Robo を初期化する必要があります。

cd /path/to/myproject
ロボ初期化

これは実際には、次のコンテンツを含む新しいRoboFile.phpをフォルダーに作成するだけです。

 <?php class RoboFile extends \Robo\Tasks { }

最初のコマンドを追加するには、パブリック メソッドを追加するだけです。

 <?php class RoboFile extends \Robo\Tasks { public function hello($world) { $this->say("Hello, $world"); } }

ご想像のとおり、上記のメソッドはコマンドhelloを作成し、単純に画面にメッセージを出力します。

解析引数

上記のようにそのメソッドを追加するだけで、私が Robo を好む重要な理由の 1 つ、つまりコマンド ライン引数の解析を示すことができます。

私が何を意味するかを示すために、次のコマンドを実行してみましょう。

ロボこんにちは

十分な引数がありません (欠落: "world")。

こんにちは [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [ -n|--いいえ
-interaction] [--simulate] [--progress-delay PROGRESS-DELAY] [-D|--define DEFINE] [--]

あはは! helloコマンドは実際には$worldパラメーターを想定しており、コマンドの完全な使用法構文を書き出すため、Robo からエラー メッセージが表示されます。

メソッドを少し変更して、パラメーターをオプションにしましょう。

 public function hello($world = 'from Robo') { $this->say("Hello, $world"); }

…では、もう一度実行してみましょう:

# 引数なし
ロボこんにちは
こんにちは、ロボから

# 簡単な引数で
ロボこんにちは!
こんにちは!

# スペースを含む引数を使用
robo こんにちは「私はコマンドラインに住んでいます」
こんにちは、私はコマンドラインに住んでいます

その方がいいです! パラメータをオプションにすることで、Robo は引数を渡さなくてもメソッドを問題なく実行できるようになりました。 また、単純な引数と引用符内の引数を渡すことができ、それが機能することも確認しました。

コマンド ライン スクリプトの引数チェック ロジックを記述したことがある方なら、これが優れた機能である理由がわかるでしょう。 それはただ多くの痛みを取り除きます。

helloコマンドの例では、位置引数を 1 つ使用しています。 Robo は、いくつかのデフォルト値を持つ配列引数を作成することにより、フラグと名前付き引数の使用もサポートします。

関数をさらに変更して、オプションでいくつかの追加文字を出力してみましょう。

 public function hello( $world = 'from Robo', $flags = [ 'stars' => false, 'stripes' => false ] ) { if ( $flags['stars'] ) $this->say( '***************' ); if ( $flags['stripes'] ) $this->say( '===============' ); $this->say( "Hello, $world" ); if ( $flags['stripes'] ) $this->say( '==============='); if ( $flags['stars'] ) $this->say( '***************' ); }

これにより、必要に応じて二重ダッシュを使用して名前付き引数を渡すことができることを Robo に伝えます。

# 名前付き引数を含めるだけで、値 'true' が得られます
ロボハロー --stars
 ****************
 こんにちは、ロボから
 ****************

入出力

IO を使用した例も既に見ました。 Robo タスク オブジェクトのsay()関数は、単純に文字列をユーザーに出力します。 ユーザーに入力を求めるask()関数もあります。

 public function hello() { $word = $this->ask("Tell me what to say:"); $this->say( $word ); }
ロボこんにちは
? 何を言うべきか教えてください: foobar
フーバー

Robo は Symfony コンソールを使用してユーザー インタラクションを作成します。 これは、2 つの単純なsay()およびask()関数に加えて、Symfony コンソールからtable()のような任意の関数にアクセスできることを意味します。

 public function table() { $this->io()->table( ['Header 1', 'Header 2'], [ ['Cell 1-1', 'Cell 1-2'], ['Cell 2-1', 'Cell 2-2'], ['Cell 3-1', 'Cell 3-2'], ] ); }
ロボテーブル
---------- ----------
 ヘッダー 1 ヘッダー 2
---------- ----------
 セル 1-1 セル 1-2
 セル 2-1 セル 2-2
 セル 3-1 セル 3-2
---------- ----------

かっこいいでしょ?

素晴らしい助っ人

Robo が好まれるもう 1 つの理由は、多くの一般的なタスクのサポートが組み込まれているため、3 か月後に戻ってきた場合でも、わかりやすいコードを簡単に記述できることです。 Robo が、かなり標準的なタスクの非常にクリーンなコードを作成するのにどのように役立つかを見てみましょう。

 # Create a directory, and switch to it: $this->taskExecStack() ->stopOnFail() ->exec('mkdir site') ->exec('cd site') ->run(); # Search and replace inside a text file: $this->taskReplaceInFile('VERSION') ->from('0.2.0') ->to('0.3.0') ->run(); # Run composer update: $this->taskComposerUpdate()->run(); # SSH into a server, go to a specific directory, list the contents of the directory, and set permissions on the logs subdirectory $this->taskSshExec('remote.example.com', 'user') ->remoteDir('/var/www/html') ->exec('ls -la') ->exec('chmod g+x logs') ->run();

上記のすべては、通常の PHP とexec()関数を使用して実行できますが、コマンド文字列をつなぎ合わせて、混乱を招くことなく引数を正しくエスケープしようとする絶望的な作業になることがよくあります。

上記の例に加えて、Git、Subversion、Rsync、Bower、Gulp、Docker、NPM、および開発環境でよく使用されるその他のツールも同様にサポートされています。

ロボのメリット

まとめると、Robo を使用すると、コマンド ライン スクリプトの作成がはるかに簡単になり、最終的な結果は通常、プレーンな PHP よりもはるかに意味的に魅力的になります。

Robo のスクリプトは、純粋な PHP スクリプトに比べて読みやすく、理解しやすいと思います。コマンド ラインの定型文の多くが Robo 自体の内部に隠されているためです。 個人的には、数か月後に自分のコードを見て、正直なところ誰が書いたのか疑問に思うことがあります。

Robo で WordPress を維持する

この記事の残りの部分は、WP-CLI、Composer の使用、およびコマンド ラインの操作に多少慣れていることを前提としています。

重要なファイル

このセットアップには 4 つの重要なファイルがあります。 この投稿全体で、それぞれについて説明します。

  1. wp-cli.yml – 標準の WP-CLI 構成ファイル。 これを使用して、複数の環境を管理する場合に WP-CLI の優れた組み込み機能のいくつかを活用しています。
  2. RoboFile.php – これは、robo コマンドを実装するためのベース ファイルです。
  3. robo.yml – Robo コマンドの追加構成パラメーター用のカスタム YAML ファイル。
  4. composer.json – 標準の Composer 構成ファイル。

私の環境

この記事の残りの部分の準備として、私のローカル開発環境がどのように設定されているかを簡単に説明します。 これは、ディスク上で整理した方法を簡略化したものです。

~/src
├──devenv/
│ ├── RoboFile.php
│ ├── composer.json
│ ├── wp-cli.yml
│ ├──robo.yml
│ ├── wordpress-dev/
│ └── wordpress-test/    
├──プラグイン1/
│ ├──資産/
│ └──含む/
└──プラグイン2
    └── ...

srcフォルダーには、開発に関連するすべてのものが格納され、 devenvフォルダーには、実際のランタイム環境に固有のファイルが格納されます。 通常、複数の WordPress 環境を同時に実行しているため、各 WordPress インストールには、この例ではwordpress-devおよびwordpress-testという名前の独自のサブフォルダーがあります。

私が取り組んでいる各プラグインは、プラグインごとに個別のフォルダーにあります。

現実の世界では、Delicious Brains での作業をさまざまなサイド プロジェクトから分離できるように、複数の devenv フォルダーを持っていますが、それはこの記事には関係ありません。

データベース ユーザー

すべてを機能させるために、ローカルの MySQL インストールに各 WordPress インストール用のローカル データベースも作成しました。これらのデータベースへの適切なアクセス権を持つ適切なwordpressという名前のデータベース ユーザーがいます。 データベースの正確な詳細とユーザー資格情報はwp-cli.ymlファイルに保存されます。

ウェブサーバー

ローカル Web サーバーとして nginx を使用していますが、Apache2 も同様に機能することがわかります。 私の nginx 設定は、 http://www.wordpress-dev.localhttp://www.wordpress-test.localが上記の 2 つの WordPress フォルダーを指すように設定されています。

依存関係の処理

私の Robo スクリプトをより柔軟にするために、Composer を介してインストールされたいくつかの追加機能、特に Symfony Yaml パーサーを使用しています。 RoboFile.phpは実際には単なる通常の PHP ファイルであるため、必要なライブラリを自由に含めることができ、そのために Composer を自然に使用します。 このプロジェクトのcomposer.jsonファイルは次のようになります。

 { "require": { "symfony/yaml": "^5.2" } }

それをコピーする場合は、 composer updateを使用してライブラリを実際にインストールすることを忘れないでください。

wp-cli.yml の活用

WP-CLI を使用する場合、 wp-cli.ymlなどの構成ファイルを使用することで作業を大幅に簡素化できます。 私が WP-CLI 構成ファイルを使用する主な理由は 2 つあります。エイリアスと、さまざまなサブコマンドのデフォルト設定です。

WP-CLI のエイリアスとは?

基本的に、WP-CLI エイリアスは設定ファイル内のラベルにすぎず、デフォルトの一部をオーバーライドできます。

エイリアスの最も一般的な使用法は、おそらくデフォルトのpathをオーバーライドして、各エイリアスが個別の WordPress インストールを指すようにすることです。 各 WordPress のインストールでは、データベース資格情報を含む独自の構成ファイルが保持されるため、この方法で使用されるエイリアスも別のデータベースを表します。 WP-CLI 構成ファイルのエイリアスは、 urlpathuserssh 、およびhttpの設定をオーバーライドできますが、サブコマンドのデフォルト値をオーバーライドすることはできません。

@testという名前の追加の WordPress 環境を作成すると、次のような WP-CLI コマンドを実行できます。

# dev WordPress インストールのすべてのプラグインを一覧表示する
wpプラグイン一覧

# テスト WordPress インストールのすべてのプラグインを一覧表示する
wp @test プラグイン一覧

コマンドのデフォルト

これを試したことがない場合は、サブコマンドのデフォルト パラメーターを設定すると非常に便利です。 たとえば、 config createコマンドを使用して新しい WordPress 構成ファイルを作成する場合、毎回少なくとも 3 つのパラメーターを指定する必要があります。

$ wp config create --dbname=somedb --dbuser=myuser --dbpass=secret

これを入力するのに飽きたら、パラメーターをwp-cli.ymlファイルに貼り付けることができます。

 config create: dbuser: myuser dbpass: secret dbname: somedb

それが完了したら、 wp config createを使用するだけで、 wp-cli.ymlファイルから適切なパラメーターが取得されます。

残念ながら、エイリアスごとに異なるコマンド デフォルトを設定することはできません。 これが、Robo の自動化を検討し始めた理由の 1 つです。

私の WP-CLI 設定ファイルは次のようになります。

 # Global parameter defaults path: wordpress-dev url: http://www.wordpress-dev.local user: admin @test: path: wordpress-test url: www.wordpress-test.local # Subcommand defaults config create: dbuser: wordpress dbpass: ***** dbname: wordpress extra-php: | define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true); define( 'SCRIPT_DEBUG', true ); core install: admin_user: admin admin_password: admin admin_email: [email protected] title: WordPress Dev core multisite-install: admin_user: admin admin_password: admin admin_email: [email protected]

この構成ファイルを配置するだけで、毎回個々のパラメーターを指定しなくても、一般的なコマンドを実行できます。

# テスト環境でデータベースをリセット
wp @test db リセット --はい

# 最新バージョンをダウンロードし、wp-config.php ファイルを作成します
wp @test コアのダウンロード
wp @test config create

# WordPress をインストール
wp @test core install --title="WordPress テスト"

WP-CLI は構成ファイルからほとんどのパラメーターを取得するため、通常は入力する必要がある--dbuser--admin_emailなどのすべてのコマンド ライン パラメーターを入力する必要はありません。

上記の最後の例では、 titleパラメータを個別に指定したことに注意してください。 これは、テスト環境でサイト タイトルを異なるものにしたいためですが、エイリアスを使用してこのパラメーターをオーバーライドすることはできません。

カスタム Robo コマンドの作成

新しい WordPress インストールを設定するだけでは、ほとんど十分ではありません。 通常、1 つまたは複数のプラグインをインストールしてアクティブ化する必要があり、多くの場合、いくつかの設定を修正する必要があります。

慎重に書かれた WP-CLI 構成ファイルを使用しても、WordPress 環境をリセットしてすべての準備を整えたい場合、長いコマンド列が必要になります。 私はしばしばこのようなシーケンスを何度も繰り返しました:

# 開発環境をリセット
wp db リセット --はい
rm -rf パス/to/wordpress
wp コア ダウンロード
wp config create
wpコアのインストール
ln -s パス/to/my/plugin1 パス/to/wordpress/wp-content/plugins/
wp plugin activate plugin1

WP-CLI 構成ファイルを最大限に活用する場合でも、これは大量の入力になります。 これを何度も入力したり、時々間違えたりするのを避けるために、Robo を使用して 2 つの特殊なコマンドを作成しました。

  • reset – WordPress 環境を既知の状態にリセットします。
  • profile – 既存の環境で一連のコマンドを実行します。

WP-CLI サブコマンドのデフォルト パラメータは別のコマンド ライン環境に拡張されないため、Robo を使用して同じ石でその鳥を殺すことができます。 方法を見てみましょう。

コマンド構成

最初に、このために作成した Robo 構成ファイルを確認します。 これは YAML で記述されているため、理解と拡張がかなり簡単になります。 それを使用するコマンドに到達するにつれて、各セクションに進みます。

 wordpress-dev: cli-prefix: "" path: "wordpress" core-multisite-install: title: WordPress Multisite post-install: - ln -s $cwd/../plugins1 $path/wp-content/plugins/ - ln -s $cwd/../plugins2 $path/wp-content/plugins/ wordpress-test: cli-prefix: "@test" path: "wordpress-test" config-create: dbname: wordpress-test core-install: title: WordPress Test core-multisite-install: title: WordPress Test Multisite post-install: - ln -s $cwd/../plugins1 $path/wp-content/plugins/ profiles: woocommerce: - $wp plugin install --activate woocommerce - $wp wc payment_gateway update cheque --enabled=true --user=admin - $wp option update woocommerce_calc_taxes yes - $wp wc tax create --name=VAT --rate=10 --user=admin - $wp wc shipping_zone_method create 0 --method_id=flat_rate --user=admin - $wp option update --format=json woocommerce_flat_rate_1_settings '{"title":"Flat rate","tax_status":"taxable","cost":"15"}' imageimport: - $wp media import $cwd/../media/lots-of-images/* issue2530: - $wp plugin install --activate some_plugin - $wp config set FOOBAR true --raw

各 WordPress 環境は、 wordpress-$envキーを使用して識別されます。 各キーには、複数の構成値を保持できます。

resetコマンド

最初のコマンドはresetです。 コマンドラインから次のように使用します。

# dev (デフォルト) 環境をリセットします
ロボリセット

# または、より明確に
ロボリセット –env=dev

# テスト環境をリセット
ロボ リセット –env=テスト

# 開発環境をリセットし、WordPress マルチサイトをインストールします
ロボリセット --マルチ

# 開発環境を特定の WordPress バージョンにリセットする
ロボリセット --ver=5.6.1

このコマンドが最初に行うことは、ターゲットの WordPress インストール ディレクトリにあるすべての既存のファイルとフォルダーを削除し、構成済みの WordPress データベースをリセットすることです。

次に、 resetコマンドは WP-CLI コマンドcore downloadconfig create 、および--multiオプションに応じてcore installまたはcore multisite-installのいずれかを使用します。

可能な限り、これはwp-cli.ymlファイルにあるコマンド パラメーターのデフォルトを使用します。 これは、Robo ラッパーを使用せずに WP-CLI を直接実行する場合にも、これらのデフォルトが役立つためです。 ただし、前述のとおり、場合によってはそれが不可能な場合もあります。

したがって、 robo.ymlファイルは、 wp-cli.yml. たとえば、 @test 環境をインストールするとき、 core installパラメーター--titleのパラメーターをオーバーライドします。 robo.ymlに以下を追加することで、これを行うことができます。

 wordpress-test: ... ... core-install: title: WordPress Test ... ...

ここでの構文は非常に簡単です。キーとしての CLI コマンド名 (スペースをダッシュ​​に置き換えたもの) と、名前付きパラメーターごとに 1 つのサブキーです。 上記の例では、 core install cli コマンドに次の追加パラメーターが生成されます。

wp @test core install --title="WordPress テスト"

インストール後の手順

構成ファイル内の各環境キーは、必要に応じて、インストール後の手順で配列を指定できます。 これは、WordPress のインストールが完了したときに実行される bash コマンドの単なるリストです。 柔軟性を高めるために、コマンドが実行される前にいくつかの文字列が置換されます。

交換された
$cwd 現在の作業ディレクトリ
$パスターゲットの WordPress インストールのパス
$wp エイリアスプレフィックスを含む wp-cli コマンド、つまり wp @test
(チルダ記号) 現在のユーザーの HOME ディレクトリ

したがって、 ln -s $cwd/../plugin1 $path/wp-content/plugins/のインストール後のステップでは、プラグイン フォルダーの 1 つからターゲットの WordPress インストールのプラグイン サブフォルダーへのシンボリック リンクが作成されます。

profileコマンド

profileコマンドは、インストール後の手順と非常に似ていますが、その使用目的は、既存の WordPress インストールで一連のコマンドを実行することです。 ほとんどの作業を行う非常に単純な開発環境があるとします。ただし、WooCommerce プラグインをインストールして基本的なセットアップを行う必要がある場合があります。 これがprofileコマンドの目的です。 次のように使用できます。

# 開発環境をリセット
ロボリセット

# WooCommerce をインストールし、設定を変更します
ロボ プロファイル woocommerce

上記のサンプルrobo.ymlファイルには WooCommerce プロファイルがあります。 そのプロファイルを適用すると、次のようになります。

  • WP-CLI を使用して WooCommerce をインストールして有効にします。
  • wc sub コマンドを使用して、支払いゲートウェイ、税ゾーン、および配送設定をセットアップします。
  • optionサブコマンドを使用して、WordPress のオプション テーブルの一部の設定を直接変更します。

異なるプロファイルを使用すると非常に便利です。 私はほとんどの時間を WP Offload Media プラグインの作業に費やしており、多くの画像を WordPress メディア ライブラリにインポートする必要があります。 WP-CLI には、これに非常に便利なコマンドがあります。

wp import media /some/long/path/I/度々/忘れる/*

私は一般的に多くのことを忘れがちで、特に長いパス名を忘れがちなので、覚えやすいと思います。

ロボ プロファイル イメージインポート

別の例を次に示します。 私は、プラグインと別の一般的な WordPress プラグインとの間の互換性の問題を修正しようとしている特定の GitHub の問題に取り組んでいます。 その問題に取り組むときは、そのプラグインをインストールし、 wp-config.php. だから私はそれのためのプロファイルを作成しました:

 .... issue2530: - $wp plugin install --activate some_plugin - $wp config set FOOBAR value

これで、 robo profile issue2530だけで、環境を 1 ステップで準備できます。

リセット コマンドpost-install手順と同様に、プロファイル定義の各行は、実際には個別の bash コマンドにすぎません。 それを使用して、別のスクリプトを起動したり、ファイルを削除したり、好きなものを何でも使用できます。 自分の足を撃ってしまう可能性もありますので、慎重に踏んでください。

起源

上記のいずれかを試すのが興味深いと思われる場合は、上記のすべてに使用している RoboFile を次に示します。これを使用して、Robo を使用した WordPress の管理を開始してください。

 <?php use Robo\Symfony\ConsoleIO; use Robo\Tasks; use Symfony\Component\Yaml\Yaml; require_once 'vendor/autoload.php'; /** * Class RoboFile */ class RoboFile extends Tasks { /** * Reset the WordPress environment to a known state. Reads environments * and configuration from robo.yml * * @option env Environment (dev, test etc) * @option multi Make a multi site install * @option ver WordPress version * * @return bool */ public function reset( $opts = [ 'env' => 'dev', 'multi' => false, 'ver' => 'latest' ] ) { $env = $opts['env']; $version = $opts['ver']; $multi = $opts['multi']; $all_config = $this->read_yaml(); $key = "wordpress-$env"; if ( ! $this->ensure_basic_config( $all_config, $env ) ) { return false; } if ( ! isset( $all_config[ $key ]['path'] ) ) { $this->say( "No path set for environment $env." ); } $config = $all_config[ $key ]; $prefix = $config['cli-prefix']; $wp = trim( "wp $prefix" ); $path = $config['path']; $path = substr( $path, 0, 1 ) !== '/' ? __DIR__ . '/' . $path : $path; $version = $version === 'latest' ? '' : "--version=$version"; $config_create = $this->additional_parameters( 'config create', $config ); $install_cmd = $multi ? 'core multisite-install' : 'core install'; $install_params = $this->additional_parameters( $install_cmd, $config ); echo "$wp $install_cmd $install_params\n"; $this->taskExec( "$wp db reset --yes" )->run(); $this->taskExecStack() ->exec( "rm -rf $path/*" ) ->exec( "$wp core download $version" ) ->exec( "$wp config create $config_create" ) ->exec( "$wp config delete WP_DEBUG" ) ->exec( "$wp $install_cmd $install_params" ) ->run(); foreach ( $config['post-install'] as $cmd ) { $cmd = str_replace( '$wp', $wp, $cmd ); $cmd = str_replace( '$path', $path, $cmd ); $cmd = str_replace( '$cwd', __DIR__, $cmd ); $cmd = str_replace( '~', getenv( "HOME" ), $cmd ); echo $cmd . "\n"; $this->taskExec( $cmd )->run(); } } /** * Run a set of wp-cli commands on an existing WordPress environment * * @param string $profileName Name of the profile in robo.yml * * @option env Environment (dev, test etc) */ public function profile( $profileName, $opts = ['env' => 'dev']) { $env = $opts['env']; $all_config = $this->read_yaml(); $key = "wordpress-$env"; if ( ! $this->ensure_basic_config( $all_config, $env ) ) { return false; } $config = $all_config[ $key ]; $prefix = $config['cli-prefix']; $wp = trim( "wp $prefix" ); $path = $config['path']; $path = substr( $path, 0, 1 ) !== '/' ? __DIR__ . '/' . $path : $path; if ( ! isset( $all_config['profiles'][ $profileName ] ) ) { $this->say( "Profile $profileName not found" ); return false; } $profile = $all_config['profiles'][ $profileName ]; foreach ( $profile as $cmd ) { $cmd = str_replace( '$wp', $wp, $cmd ); $cmd = str_replace( '$path', $path, $cmd ); $cmd = str_replace( '$cwd', __DIR__, $cmd ); $cmd = str_replace( '~', getenv( "HOME" ), $cmd ); // Quick and dirty. If the cmd exactly matches another profile, run it! if ( isset( $all_config['profiles'][ $cmd ] ) ) { $this->profile( $cmd, $env ); continue; } echo $cmd . "\n"; $this->taskExec( $cmd )->run(); } } /** * @return array */ private function read_yaml() { return Yaml::parseFile( __DIR__ . '/robo.yml' ); } /** * @param $config * @param $env * * @return bool */ private function ensure_basic_config( $config, $env ) { $key = "wordpress-$env"; if ( ! isset( $config[ $key ] ) ) { $this->say( "No path set for environment $env." ); return false; } if ( ! isset( $config[ $key ]['cli-prefix'] ) ) { $this->say( "No wp-cli prefix set for environment $env." ); return false; } return true; } /** * @param string $name * @param array<string, string> $config * * @return string */ private function additional_parameters( $name, $config ) { $name = str_replace( ' ', '-', $name ); if ( ! isset( $config[ $name ] ) ) { return ''; } return implode( ' ', array_map( function ( $v, $k ) { return sprintf( "--%s='%s'", $k, $v ); }, $config[ $name ], array_keys( $config[ $name ] ) ) ); } }

まとめ

開発では、反復的なタスクは領域に沿って進む傾向があります。 それらを完全になくす方法はわかりませんが、可能な限り多くの自動化を行うことで、利用可能な時間で実際の作業をできるだけ多く行うことができます。

ここで概説した WP-CLI と Robo を組み合わせてこれらのタスクの一部を自動化することで、プラグイン開発者としての毎日の時間を節約できました。 これらのことを手動で行うことに戻ることはできませんでした。

開発ワークフローの最も面倒な部分を自動化するために、どのツールを使用していますか? コメントで教えてください。