1. Знакомство
Итак, знакомьтесь — Phing.
Своеобразный PHP ремикс Ant`а, но более простой в освоении, и в то же время достаточно мощный. Phing позволяет решать тривиальные для PHP проектов задачи, имеет множество встроенных средств и неплохой API, на случай если встроенных средств всё же будет недостаточно. Управлять сборкой мы можем при помощи XML файлов, в которых описываем цели и задачи, выполняемые в процессе сборки проекта.
2. Установка
Phing — проще всего установить из репозитария PEAR.
$ pear channel-discover pear.phing.info $ pear install phing/phing
Желающие использовать самые свежие версии могут установить бету.
$ pear install phing/phing-beta
А для тех кто хочет помочь проекту, или, просто посмотреть, как он устроен — есть SVN(dev версия продукта — может содержать баги!).
$ svn checkout http://svn.phing.info/trunk phing
Так же можно загрузить более полные пакеты со страницы загрузки на официальном сайте.
3. Hello World!
Или даже скорее Hello Build!
Пример(build.xml):
<project name="make_project" basedir=".." default="build"> <property name="src_dir" value="protected/" override="false"/> <property name="res_dir" value="public/" override="false"/> <target name="clear_cache_dir"> <echo>Очищаем директории кэша</echo> <delete> <fileset dir="${res_dir}/assets/"> <include name="**"/> </fileset> <fileset dir="${src_dir}/runtime/"> <include name="**"/> </fileset> </delete> </target> <target name="build" depends="clear_cache_dir"> </target> </project>
Попробуем разобрать файл по командам.
Приведенный выше код объявляет проект с именем make_project и базовой директорией, на один уровень выше, чем файл сборки, и изначальной целью build. При этом цель build имеет зависимость(свойство depends) от цели clear_cache_dir.
Ещё выше мы видим описание цели clear_cache_dir. У этой цели есть 2 задачи:
1. echo — вывод строчки «Очищаем директории кэша»
2. delete — рекурсивная очистка директорий /assets/ и /runtime/
Для интереса попробуем усложнить задачу.
Пусть, теперь нам нужно скомпилировать .less файлы в проекте.
Описываем задачу:
<target name="less_exec"> <exec command="lessc ${project.basedir}/${src_dir}/${current_file} > ${project.basedir}/${src_dir}/${current_file}.css" /> </target> <target name="compile_less"> <echo>Компиляция .less файлов</echo> <foreach param="current_file" target="less_exec"> <fileset dir="${src_dir}/"> <include name="**/assets/css/*.less" /> </fileset> </foreach> </target>
Для начал рассмотрим fileset — задача создающая список файлов по определенному критерию. Наш fileset имеет всего одно свойство include(включение файлов) с шаблоном **/assets/css/*.less, где ** — директория произвольной вложенности.
То есть fileset имеет следующее условие: искать файлы с расширением .less лежащие в директориях /assets/css/ которые в свою очередь находятся в произвольных директориях вложенных в ${src_dir}(см код выше).
Далее мы проходимся по списку найденных файлов при помощи задачи foreach, отправляя каждый найденный файл в переменной ${current_file}(param — переменная в которой текущее значение списка будет передано целевой задаче) в задачу less_exec(target — целевая задача обрабатывающая каждое значение списка).
less_exec — всего лишь вставляет путь до файла в вызов команды lessc в терминале, и указывает в качестве выходного файла путь до .less файла + .css. в итоге все .less файлы в проекте будут скомпилированы в %filename%.less.css.
При желании можно написать задачу переименовывающую эти файлы в стандартный .css или минифицирующую их, но это мы оставим в качестве домашнего задания читателям.
Просто не так ли? А учитывая, что у Phing есть довольно обширные встроенные средства(JsMin, JsLint, tar и даже средства взаимодействия с различными VCS), мы можем довольно быстро автоматизировать сборку, отправку в репозитарий или бекап проекта.
4. Profit?
А он в данном случае очевиден — за пол часа мы можем автоматизировать сборку проекта и избавить себя от рутинных операций. Если вам недостаточно стандартных возможностей Phing — вы можете создать свои типы задач, всё делается очень просто и для разработчика разбирающегося в PHP и XML не составит труда.
Меня Phing заинтересовал, когда понадобилось компилировать файлы .less в обычный .css перед заливкой на боевой сервер. Но я уверен, что у каждого разработчика, есть задачи, для решения которых, пригодится Phing.