Как стать автором
Обновить

Phing — сборка PHP проектов

Время на прочтение4 мин
Количество просмотров46K
У многих из нас, бывают ситуации когда проект требует подготовки к выводу в продакшн, и зачастую эта подготовка состоит из множества действий, которые приходится выполнять много раз(например при сборке релизной версии). Зачастую задачи сводятся к выполнению простых консольных команд, очистке кеша, минификации JS и CSS или сборки их в один файл, но вся эта рутина может занять довольно продолжительное время, а так как выполняется, чаще всего, в конце рабочего дня, довольно легко опечататься и отправить несколько дней\часов\минут работы над проектом в небытие. В такой ситуации программисты стараются, как то автоматизировать сборку и подготовку проекта к рабочему состоянию, в чём им помогают различные системы сборки, об одной из которых и пойдёт речь в статье.

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.
Теги:
Хабы:
Всего голосов 77: ↑74 и ↓3+71
Комментарии45

Публикации

Истории

Работа

PHP программист
148 вакансий

Ближайшие события