У многих из нас, бывают ситуации когда проект требует подготовки к выводу в продакшн, и зачастую эта подготовка состоит из множества действий, которые приходится выполнять много раз(например при сборке релизной версии). Зачастую задачи сводятся к выполнению простых консольных команд, очистке кеша, минификации JS и CSS или сборки их в один файл, но вся эта рутина может занять довольно продолжительное время, а так как выполняется, чаще всего, в конце рабочего дня, довольно легко опечататься и отправить несколько дней\часов\минут работы над проектом в небытие. В такой ситуации программисты стараются, как то автоматизировать сборку и подготовку проекта к рабочему состоянию, в чём им помогают различные системы сборки, об одной из которых и пойдёт речь в статье.
Итак, знакомьтесь — Phing.
Своеобразный PHP ремикс Ant`а, но более простой в освоении, и в то же время достаточно мощный. Phing позволяет решать тривиальные для PHP проектов задачи, имеет множество встроенных средств и неплохой API, на случай если встроенных средств всё же будет недостаточно. Управлять сборкой мы можем при помощи XML файлов, в которых описываем цели и задачи, выполняемые в процессе сборки проекта.
Phing — проще всего установить из репозитария PEAR.
Желающие использовать самые свежие версии могут установить бету.
А для тех кто хочет помочь проекту, или, просто посмотреть, как он устроен — есть SVN(dev версия продукта — может содержать баги!).
Так же можно загрузить более полные пакеты со страницы загрузки на официальном сайте.
Или даже скорее Hello Build!
Попробуем разобрать файл по командам.
Приведенный выше код объявляет проект с именем make_project и базовой директорией, на один уровень выше, чем файл сборки, и изначальной целью build. При этом цель build имеет зависимость(свойство depends) от цели clear_cache_dir.
Ещё выше мы видим описание цели clear_cache_dir. У этой цели есть 2 задачи:
1. echo — вывод строчки «Очищаем директории кэша»
2. delete — рекурсивная очистка директорий /assets/ и /runtime/
Для интереса попробуем усложнить задачу.
Пусть, теперь нам нужно скомпилировать .less файлы в проекте.
Описываем задачу:
Для начал рассмотрим 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), мы можем довольно быстро автоматизировать сборку, отправку в репозитарий или бекап проекта.
А он в данном случае очевиден — за пол часа мы можем автоматизировать сборку проекта и избавить себя от рутинных операций. Если вам недостаточно стандартных возможностей Phing — вы можете создать свои типы задач, всё делается очень просто и для разработчика разбирающегося в PHP и XML не составит труда.
Меня Phing заинтересовал, когда понадобилось компилировать файлы .less в обычный .css перед заливкой на боевой сервер. Но я уверен, что у каждого разработчика, есть задачи, для решения которых, пригодится Phing.
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.