Управление средами разработки WordPress с помощью WP-CLI и Robo
Опубликовано: 2022-09-13
Автоматизация повторяющихся задач — один из лучших способов сэкономить время в рабочем процессе разработки. В моей повседневной работе в качестве разработчика плагинов мне часто приходится сбрасывать базу данных, переустанавливать определенную версию WordPress, устанавливать один или несколько плагинов и обновлять настройки. Это быстро утомляет, так что это естественное решение для автоматизации. В этой статье я покажу вам, как я использую WP-CLI в сочетании с Robo для автоматизации задач, необходимых для управления моей средой разработки WordPress.
Инструмент командной строки WordPress, WP-CLI, — отличное начало для ускорения вашего рабочего процесса. Если вы не знакомы с ним, я настоятельно рекомендую прочитать один из наших многочисленных постов в блоге. Наше руководство по установке — отличная отправная точка, в нем рассказывается, как установить его в вашей ОС, настроить автодополнение с помощью вкладок и создать файл конфигурации.
Оглавление
- Что такое Робо?
- Robo упрощает командную строку PHP
- Установка Робо
- Ваша первая команда
- Ввод и вывод
- Отличные помощники
- Преимущества Робо
- Поддержка WordPress с помощью Robo
- Важные файлы
- Моя среда
- Пользователь базы данных
- Веб сервер
- Забота о зависимостях
- Использование wp-cli.yml
- Что такое псевдоним в WP-CLI?
- Значения команды по умолчанию
- Создание пользовательских робо-команд
- Конфигурация команды
- Команда
reset
- Действия после установки
- Команда
profile
- Подведение итогов
Что такое Робо?
Robo — это современная программа для выполнения задач с открытым исходным кодом, используемая рядом проектов, включая Drush и Codeception.
Robo похож на Gulp и Grunt, но использует PHP, а не JavaScript.
Идея состоит в том, что вы можете создавать изящные маленькие команды, подобные этой:
# Сбросить мою среду разработки WP и сделать ее мультисайтовой робот сброс --multi # Установите и настройте плагин WP Offload Media профиль робота ome-dev
Средство выполнения задач Robo упрощает документирование создаваемых вами команд, добавляя комментарии DocBlock к вашим командам, чтобы вы могли предоставить помощь для будущих версий себя:
# Robo без аргументов покажет доступные команды. робот Доступные команды: help Отображает справку по команде list Список команд profile Запустите набор команд wp-cli в существующей среде WordPress. reset Сброс среды WordPress до известного состояния
Запрос дополнительной информации о конкретной команде:
робот поможет сбросить Описание: Сбросьте среду WordPress до известного состояния. Читает среды и конфигурацию из robo.yml Применение: сбросить [опции] Опции: --env[=ENV] Среда (разработка, тестирование и т. д.) [по умолчанию: "dev"] --multi Сделать многосайтовую установку --ver[=VER] Версия WordPress [по умолчанию: «последняя»]
Я создал несколько мощных команд с Robo, которые я использую каждый день для управления своей средой разработки WordPress. В этой статье я поделюсь с вами этими командами и попутно расскажу о командах Robo.
Robo упрощает командную строку PHP
Давайте немного посмотрим в зеркало заднего вида. Написание команд PHP для командной строки, безусловно, не ново. Всегда можно было просто запустить PHP-скрипт из командной строки следующим образом:
php myscript.php
Насколько я помню, PHP был доступен как среда командной строки в большинстве сред *NIX. Добавление PHP shebang будет работать в большинстве сред, в которых установлен интерпретатор PHP.
// file: myscript #!/usr/bin/env php <?php // do stuff here…
Что позволяет выполнять скрипт из командной строки, не указывая, что он должен анализироваться PHP (или включая расширение файла .php):
мой сценарий
Недостатком запуска необработанных PHP-скриптов из командной строки является то, что в каждом скрипте требуется много накладных расходов на ввод и вывод. Процесс приема аргументов из командной строки и последующего вывода сообщений в командную строку немного громоздок и не кажется очень гибким.
Robo стремится упростить написание PHP для командной строки, позаботившись о большом количестве стандартной «сантехники», которая требуется большинству скриптов. Это позволяет вам сосредоточиться на основных функциях ваших скриптов.
Установка Робо
Вам нужно установить Robo, прежде чем мы сможем начать. Я держу Robo глобально установленным на своей машине, поэтому я установил его следующим образом:
композитор глобальный требует консолидации/робо
Но, как и все, что установлено через Composer, вы можете оставить его как зависимость от проекта, если вам так удобнее. Кроме того, на GitHub есть инструкции по его установке, загрузив robo.phar
.
Ваша первая команда
Во-первых, нам нужно инициализировать Robo в папке проекта:
компакт-диск /путь/к/мойпроект Инициализация робота
Это действительно просто создает новый RoboFile.php
в вашей папке со следующим содержимым:
<?php class RoboFile extends \Robo\Tasks { }
Чтобы добавить нашу первую команду, мы просто добавляем общедоступный метод:
<?php class RoboFile extends \Robo\Tasks { public function hello($world) { $this->say("Hello, $world"); } }
Как вы, наверное, догадались, описанный выше метод создает команду hello
и просто выводит сообщение на экран.
Разбор аргументов
Простое добавление этого метода, как мы сделали выше, — отличный способ показать одну из наиболее важных причин, почему мне нравится Robo, а именно разбор аргументов командной строки.
Чтобы показать вам, что я имею в виду, давайте попробуем запустить эту команду:
робот привет Недостаточно аргументов (отсутствует: «мир»). привет [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--версия] [--ansi] [--no-ansi] [ -n|--нет -interaction] [--simulate] [--progress-delay PROGRESS-DELAY] [-D|--define DEFINE] [--]
Ага! Robo выдает мне сообщение об ошибке, потому что команда hello
на самом деле ожидает параметр $world
, а затем продолжает записывать полный синтаксис использования для команды.
Немного изменим метод и сделаем параметр необязательным:
public function hello($world = 'from Robo') { $this->say("Hello, $world"); }
…а теперь запустим снова:
# Без аргументов робот привет Привет от Робо # С простым аргументом Робот привет! Привет! # С аргументом, содержащим пробелы robo hello «Я живу в командной строке» Привет, я живу в командной строке
Так-то лучше! Сделав этот параметр необязательным, Robo теперь успешно выполняет наш метод даже без передачи аргумента. Мы также видели, что мы можем передать простой аргумент и аргумент в кавычках, и это просто работает.
Если вы когда-либо тратили время на написание логики проверки аргументов для сценария командной строки, вы, вероятно, понимаете, почему это хорошая функция. Просто снимает много боли.
Пример команды hello
использует один единственный позиционный аргумент. 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' робот привет --звезды *************** Привет от Робо ***************
Ввод и вывод
Мы также уже видели пример с использованием ввода-вывода. Функция say()
объекта задачи Robo просто возвращает строку пользователю. Существует также функция ask()
, которая позволяет запрашивать у пользователя ввод:
public function hello() { $word = $this->ask("Tell me what to say:"); $this->say( $word ); }
робот привет ? Скажи мне, что сказать: фубар фубар
Robo использует консоль Symfony для создания взаимодействий с пользователем. Это означает, что кроме двух простых функций say()
и ask()
у нас есть доступ к любой функции из Symfony Console, например, к 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, заключается в том, что он имеет встроенную поддержку многих распространенных задач, что упрощает написание понятного кода, даже если вы вернетесь к нему через 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. Лично я могу посмотреть на свой собственный код через несколько месяцев и честно задаться вопросом, кто его написал, поэтому все, что помогает мне писать четкий, читаемый код, является долгожданным дополнением в моем наборе инструментов.
Поддержка WordPress с помощью Robo
В оставшейся части этой статьи предполагается, что вы немного знакомы с WP-CLI, использованием Composer и работой с командной строкой.
Важные файлы
В этой настройке есть четыре важных файла. Я расскажу о каждом из них в этом посте:
- wp-cli.yml — стандартный файл конфигурации WP-CLI. Я использую это, чтобы использовать несколько замечательных встроенных функций WP-CLI, когда дело доходит до управления несколькими средами.
- RoboFile.php — это базовый файл для реализации робо-команд.
- robo.yml — пользовательский файл YAML для некоторых дополнительных параметров конфигурации для наших команд Robo.
- composer.json — стандартный файл конфигурации Composer.
Моя среда
Чтобы подготовить почву для остальной части этой статьи, я быстро опишу, как настроена моя локальная среда разработки. Это упрощенная версия того, как я организовал вещи на диске:
~/источник ├── девенв/ │ ├── RoboFile.php │ ├── composer.json │ ├── wp-cli.yml │ ├── robo.yml │ ├── wordpress-dev/ │ └── wordpress-тест/ ├── плагин1/ │ ├── активы/ │ └── включить/ └── плагин2 └── ...
В папке src
хранится все, что связано с разработкой, а в папке devenv
хранятся файлы, относящиеся к фактической среде выполнения. Поскольку у меня обычно одновременно работает более одной среды WordPress, каждая установка WordPress имеет свою собственную подпапку с именами wordpress-dev
и wordpress-test
в этом примере.
Каждый из плагинов, над которыми я работаю, находится в отдельной папке для каждого плагина.
В реальном мире у меня есть несколько папок devenv, так что я могу хранить свою работу для Delicious Brains отдельно от различных сторонних проектов, но это не относится к этой статье.
Пользователь базы данных
Чтобы все работало, я также создал локальные базы данных для каждой из установок WordPress в моей локальной установке MySQL, и есть пользователь базы данных с метким именем wordpress
с правильным доступом к этим базам данных. Точные сведения о базах данных, а также учетные данные пользователя хранятся в файле wp-cli.yml
.
Веб сервер
Я использую nginx в качестве локального веб-сервера, но вы обнаружите, что Apache2 работает так же хорошо. Моя конфигурация nginx настроена так, что http://www.wordpress-dev.local
и http://www.wordpress-test.local
указывают на две папки 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 по двум основным причинам: псевдонимы и установка значений по умолчанию для различных подкоманд.
Что такое псевдоним в WP-CLI?
По своей сути псевдоним WP-CLI — это просто метка в файле конфигурации, которая позволяет вам переопределить некоторые значения по умолчанию.
Наиболее распространенное использование псевдонимов, вероятно, заключается в переопределении path
по умолчанию, чтобы каждый псевдоним указывал на отдельную установку WordPress. Поскольку каждая установка WordPress хранит свой собственный файл конфигурации с учетными данными базы данных, используемый таким образом псевдоним также представляет собой отдельную базу данных. Псевдоним в файле конфигурации WP-CLI может переопределить настройки url
, path
, user
, ssh
и http
, но не может переопределить значения по умолчанию для подкоманд.
Создание дополнительной среды WordPress с именем @test
позволяет мне запускать такие команды WP-CLI:

# Список всех плагинов в установке WordPress для разработчиков список плагинов wp # Список всех плагинов в тестовой установке WordPress Список плагинов wp @test
Значения команды по умолчанию
Если вы еще не пробовали это раньше, настройка параметров по умолчанию для подкоманд очень удобна. Например, когда вы создаете новый файл конфигурации WordPress с помощью команды config create
, вам нужно каждый раз указывать как минимум три параметра:
$ 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 больше автоматизации.
Мой файл конфигурации 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 сброс базы данных --yes # Загрузите последнюю версию и создайте файл wp-config.php wp @test скачать ядро wp @test конфигурация создать # Установить Вордпресс wp @test core install --title="WordPress Test"
Поскольку WP-CLI получает большинство параметров из файла конфигурации, мне не нужно вводить все параметры командной строки, такие как --dbuser
и --admin_email
, которые мне обычно приходится делать.
Обратите внимание, что в последнем примере выше я предоставил параметр title
отдельно. Это связано с тем, что я хочу, чтобы название сайта в тестовой среде было другим, но невозможно переопределить этот параметр с помощью псевдонима.
Создание пользовательских робо-команд
Настроить новую установку WordPress почти никогда не бывает достаточно. Обычно есть один или несколько плагинов, которые необходимо установить и активировать, и довольно часто нужно исправить несколько настроек тут и там.
Даже с тщательно написанным файлом конфигурации WP-CLI у меня все равно будет длинная строка команд, если я хочу сбросить свою среду WordPress и все подготовить. Я часто делал такие последовательности снова и снова:
# Сбросить мою среду разработки сброс БД wp --yes rm -rf путь/к/wordpress скачать ядро wp wp конфиг создать установка ядра wp ln -s путь/к/моему/plugin1 путь/к/wordpress/wp-content/plugins/ плагин wp активировать plugin1
Даже при полном использовании конфигурационного файла WP-CLI приходится много печатать. Чтобы не вводить это снова и снова, а также время от времени ошибаться, я создал две специализированные команды, используя Robo, чтобы сделать это за меня:
- 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
. Он используется из командной строки следующим образом:
# Сбросить среду разработки (по умолчанию) сброс робота # Или быть более явным сброс робота –env=dev # Сбросить тестовую среду сброс робота –env=test # Сбросить среду разработки и установить мультисайт WordPress робот сброс --multi # Сбросить среду разработки до определенной версии WordPress сброс робота --ver=5.6.1
Первое, что делает эта команда, — удаляет все существующие файлы и папки в целевом каталоге установки WordPress и сбрасывает настроенную базу данных WordPress.
Затем команда reset
использует команды WP-CLI core download
, config create
и одну из core install
или core multisite-install
в зависимости от параметра --multi
.
В максимально возможной степени используются значения параметров команды по умолчанию, расположенные в файле wp-cli.yml
. Причина этого в том, что эти значения по умолчанию также полезны при запуске WP-CLI напрямую без оболочки Robo. Но, как обсуждалось выше, в некоторых случаях это просто невозможно.
Поэтому файл конфигурации robo.yml
предлагает возможность указать переопределение значений по умолчанию в wp-cli.yml.
Например, при установке среды @test мы хотим переопределить параметры core install
--title
. Мы можем сделать это, добавив в robo.yml
следующее:
wordpress-test: ... ... core-install: title: WordPress Test ... ...
Синтаксис здесь довольно прост: имя команды CLI (пробелы заменены тире) в качестве ключа и один подраздел для каждого именованного параметра. В приведенном выше примере будет создан следующий дополнительный параметр для core install
cli:
wp @test core install --title="WordPress Test"
Действия после установки
Каждый ключ среды в файле конфигурации может дополнительно указывать массив с шагами после установки. Это просто список команд bash, которые выполняются после завершения установки WordPress. Для большей гибкости перед выполнением команды выполняется несколько замен строк:
Нить | Заменено на |
---|---|
$cwd | Текущий рабочий каталог |
$путь | Путь целевой установки WordPress |
$wp | Команда wp-cli, включая префикс псевдонима, т. е. wp @test |
~ | (тильда) Домашний каталог текущего пользователя |
Таким образом, послеустановочный шаг ln -s $cwd/../plugin1 $path/wp-content/plugins/
создаст символическую ссылку из одной из моих папок плагинов на подпапку плагинов в целевой установке WordPress.
Команда profile
Команда profile
очень похожа на шаги после установки, но ее предполагаемое использование — запуск набора команд в существующей установке WordPress. Допустим, у вас есть очень простая среда разработки, в которой вы выполняете большую часть своей работы. Однако иногда вам нужно установить плагин WooCommerce и выполнить для него базовую настройку. Для этого предназначена команда profile
. Его можно использовать следующим образом:
# Сбросить среду разработки сброс робота # Установите WooCommerce и внесите некоторые изменения в настройки робо-профиль woocommerce
Пример файла robo.yml
выше имеет профиль WooCommerce. Применение этого профиля:
- Установите и активируйте WooCommerce с помощью WP-CLI.
- Используйте
wc
для настройки платежного шлюза, налоговой зоны и параметров доставки. - Используйте
option
, чтобы изменить некоторые настройки непосредственно в таблице параметров WordPress.
Использование разных профилей весьма полезно. Я провожу большую часть дня, работая над плагином WP Offload Media, и мне часто приходится импортировать множество изображений в медиатеку WordPress. В WP-CLI для этого есть очень удобная команда:
wp import media /some/длинный/путь/я/часто/забыть/*
Поскольку я часто забываю многие вещи в целом и длинные пути в частности, мне легче запомнить:
импорт изображения профиля робота
Вот еще один пример. Я работаю над конкретной проблемой GitHub, когда мы пытаемся исправить проблему совместимости между нашим плагином и другим популярным плагином WordPress. Когда я работаю над этой проблемой, мне нужно установить этот плагин и установить значение конфигурации в wp-config.php.
Поэтому я создал для него профиль:
.... issue2530: - $wp plugin install --activate some_plugin - $wp config set FOOBAR value
Теперь я могу подготовить свою среду к работе за один шаг, просто robo profile issue2530
.
Так же, как шаги post-install
в команде сброса, каждая строка в определении профилей на самом деле представляет собой просто отдельную команду bash. Вы можете использовать его для запуска отдельных скриптов, удаления файлов или чего угодно. Также вполне можно выстрелить себе в ногу, так что действуйте осторожно.
Источник
Если что-то из вышеперечисленного кажется вам интересным, вот RoboFile, который я использую для всего вышеперечисленного, не стесняйтесь использовать его, чтобы начать управлять WordPress с помощью Robo.
<?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, которую я описал здесь, каждый день экономила мне время как разработчику плагинов. Я никогда больше не смогу вернуться к выполнению этих операций вручную.
Какие инструменты вы используете для автоматизации наиболее утомительных частей рабочего процесса разработки? Дай мне знать в комментариях.