Как разработчики, нам часто приходится выполнять повторяющиеся задачи, такие как обновление структуры базы данных, заполнение базы данных, написание кода CRUD, выполнение тестов и загрузка файлов на сервер. Разве не было бы здорово, если бы мы могли автоматизировать эти повседневные задачи и приступить к решению более важных проблем, таких как повышение безопасности нашего приложения или его удобство для пользователей?
Phake, инструмент автоматизации, написанный для PHP, может выполнить эти задачи за вас. Если вы знакомы с Ruby, это в основном клон Rake . В этой серии из двух частей я расскажу вам, как интегрировать Phake в ваш рабочий процесс. Я проведу вас через установку, некоторые основы использования Phake и, наконец, некоторые примеры из реальной жизни.
Установка
Phake должен быть установлен глобально через Composer:
composer global require 'jaz303/phake=*'
Это делает Phake доступным из любой папки и не требует от вас изменения файла composer.json
вашего проекта.
Если у вас нет доступа к команде «composer», установите Composer глобально .
основы
Для выполнения задач Phake вам нужно создать файл Phake. Phakefile
содержит конфигурацию для задач, которые вы хотите выполнить. Если вы использовали Grunt раньше, Phakefile
похож на Gruntfile
.
Важное замечание о Phakefile
— это просто файл PHP, поэтому вы можете просто написать его так же, как и в своих проектах PHP.
Создание задач
Вы можете создавать задачи, вызывая метод task()
. Это принимает имя задачи в качестве первого аргумента и функцию для выполнения в качестве последнего аргумента.
<?php task('task_a', function(){ echo "Hi I'm task A!\n"; });
Затем вы можете выполнить его с помощью следующей команды:
phake task_a
Это тогда возвратит следующий вывод:
Hi I'm task A!
зависимости
Если одна задача зависит от другой, вы можете указать имя этой задачи сразу после основной задачи:
<?php task('task_a', function(){ echo "Hi I'm task A!\n"; }); task('task_b', 'task_a', function(){ echo "Hi I'm task B! I need task A to execute first before I can do my thing!\n"; });
Чтобы выполнить задачи по порядку, вам нужно просто вызвать задачу, у которой сначала есть зависимость. В этом случае task_b
зависит от task_a
поэтому мы сначала вызываем его:
phake task_b
Выполнение этого вернет следующий вывод:
Hi I'm task A! Hi I'm task B! I need task A to execute first before I can do my thing!
И вы можете продолжать добавлять зависимости:
<?php task('task_a', function(){ echo "I get to execute first!\n"; }); task('task_b', 'task_a', function(){ echo "Second here!\n"; }); task('task_c', 'task_b', function(){ echo "I'm the last one!\n"; });
Выполните их, вызвав последнюю задачу, которую нужно вызвать. В этом случае, это task_c
который мы хотим выполнить последним:
phake task_c
Затем он вернет следующий вывод:
I get to execute first! Second here! I'm the last one!
Обратите внимание, что при использовании этого метода объявления зависимостей вызов task_b
приведет к task_a
что task_a
будет вызываться первым. Если вы не хотите, чтобы это происходило, и вы все еще хотите выполнить определенную задачу отдельно, не выполняя сначала ее зависимости, тогда вы можете объявить ее, используя следующий метод:
task('task_a', function(){ echo "I get to execute first!\n"; }); task('task_b', function(){ echo "Second here!\n"; }); task('task_c', 'task_a', 'task_b', function(){ echo "I'm the last one!\n"; });
В приведенном выше примере мы устанавливаем task_a
и task_b
в качестве зависимостей task_c
. Обратите внимание, что порядок имеет значение здесь. Таким образом, задача сразу после основной задачи ( task_a
) будет выполнена первой, а следующая справа от нее ( task_b
) будет второй, а затем, наконец, будет выполнена основная задача ( task_c
).
В Phake есть еще один способ определения ваших зависимостей: использование блоков «до» или «после» сразу после определения основной задачи. В этом случае наша основная задача — eat
поэтому мы определяем задачи, которые мы хотим выполнить до и после него в соответствии с его объявлением:
task('eat', function(){ echo "Yum!"; }); before('eat', function(){ echo "Wash your hands before you eat\n"; }); after('eat', function(){ echo "Brushy brush! brush!\n"; });
Когда вы выполняете eat
вы получаете следующий вывод:
Wash your hands before you eat Yum! Brushy brush! brush!
Группировка задач
С помощью Phake вы также можете группировать связанные задачи:
group('clean_the_house', function(){ task('polish_furniture', function(){..}); task('wash_the_clothes', function(){..}); task('mop_the_floor', function(){..}); });
Сгруппированные задачи можно вызывать, используя указанное вами имя группы, затем двоеточие и имя задачи, которую вы хотите выполнить:
phake clean_the_house:polish_furniture
Если вы хотите выполнить все задачи в группе, вы можете просто сделать окончательную задачу зависимой от первой и второй задачи. В приведенном ниже примере последней задачей, которую мы хотим выполнить, является задача mop_the_floor
поэтому мы делаем ее зависимой от polish_furniture
и wash_the_clothes
:
group('clean_the_house', function(){ task('polish_furniture', function(){..}); task('wash_the_clothes', function(){..}); task('mop_the_floor', 'polish_furniture', 'wash_the_clothes' function(){..}); });
Затем мы просто вызываем задачу mop_the_floor
из терминала:
phake clean_the_house:mop_the_floor
Затем это вызовет задачи в следующем порядке:
polish_furniture wash_the_clothes mop_the_floor
Описание задач
Через некоторое время использования Phake вы можете накапливать кучу задач в своем Phakefile
, поэтому неплохо иметь какую-то документацию. К счастью для нас, Phake поставляется с утилитой, которая позволяет нам описать, что делает конкретная задача Phake. Вы можете использовать его, вызывая метод desc
прямо перед объявлением задачи, которую вы хотите описать:
desc('Allows you to water the plants'); task('hose', function(){..}); desc('Allows you to wash the dish'); task('dish_washer', function(){..});
Затем вы можете перечислить доступные задачи в вашем Phakefile с помощью следующей команды:
phake -T
Он вернет вывод, подобный следующему:
hose Allows you to water the plants dish_washer Allows you to wash the dish
Передача аргументов к задачам
Чтобы сделать задачи более гибкими, мы также можем передать аргументы. Это можно сделать, объявив параметр в функции. Затем это можно использовать для доступа к отдельным аргументам, которые вы передаете задаче:
task('brush_teeth', function($args){ $motion = (!empty($args['motion'])) ? $args['motion'] : 'circular'; $includes = (!empty($args['includes'])) ? $args['includes'] : ''; brush($motion, $includes); });
Аргументы могут быть переданы путем включения пары имя-значение сразу после имени задачи. Если вы хотите передать более 1 аргумента, вы можете разделить их, используя один пробел между значением первого аргумента и именем второго аргумента:
phake brush_teeth motion=horizontal includes=tongue,teeth,gums
Если вам нужно передать аргументы с пробелами между ними, вы можете просто заключить их в одинарные или двойные кавычки:
phake brush_teeth motion="circular horizontal and vertical"
Вывод
Теперь, когда мы увидели, для чего нужен Phake и как мы можем выполнять с ним задачи, мы подготовили ландшафт для некоторых реальных приложений во второй части. Будьте на связи!