Phing — это инструмент сборки проекта PHP, основанный на Apache Ant. Система сборки поможет вам выполнить группу действий с помощью одной команды. Если вам интересно, зачем PHP нужен инструмент для сборки, рассмотрите рабочий процесс, в котором вы пишете код и модульные тесты на своем локальном компьютере, и если тесты проходят, вы загружаете код на промежуточный / рабочий сервер и вносите какие-либо изменения в производственную базу данных. , Без файла сборки вам нужно будет пройти каждый шаг вручную. Если вы делаете непрерывную интеграцию, вы будете делать одни и те же шаги снова и снова. Слишком легко случайно что-то пропустить в процессе и в итоге получить серьезную проблему на производстве. Phing помогает преодолеть такие проблемы, автоматизируя такие задачи, как запуск модульных тестов, внесение изменений в базу данных, развертывание кода приложения и т. Д. В этой статье я покажу вам некоторые основы работы с Phing.
Если у вас его еще нет, вы можете установить Phing с помощью PEAR:
shameer @ yukon: ~ $ sudo pear канал-Discover Pear.phing.info shameer @ yukon: ~ $ sudo pear установить phing / phing
Если вы хотите использовать такие задачи, как PHPUnit или PhpDocumentor, вам также необходимо установить зависимые пакеты .
Phing Hello World
Чтобы показать вам, как легко создавать файлы сборки для Phing, давайте начнем с файла сборки «Hello World». Сначала создайте каталог вашего проекта, а затем внутри него создайте файл с именем build.xml
со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="welcome" basedir="." description="a demo project"> <property name="message" value="Hello World!"/> <target name="welcome"> <echo msg="${message}"/> </target> </project>
Из командной строки перейдите в каталог и запустите phing
.
shameer @ yukon: ~ / HelloWorld $ phing Файл сборки: /home/shameer/HelloWorld/build.xml HelloWorld> добро пожаловать: [эхо] Привет, мир! СТРОИТЬ ЗАВЕРШЕНО Общее время: 0,2275 секунды
Элемент <project>
является корневым элементом файла сборки. Атрибут default
обязателен и указывает цель по умолчанию для вызова, если она не указана в командной строке. Кроме того, вы также можете указать имя проекта, базовый каталог проекта и описание, чтобы упорядочить вещи.
Элемент <target>
представляет именованную группу задач, которые могут быть выполнены. Например, различные цели могут быть определены для резервного копирования или обновления базы данных. Цель также может зависеть от других целей, которые должны быть выполнены перед выполнением.
Элемент <echo>
— это задача, одно действие, которое можно выполнить. В Phing существует ряд основных задач, которые варьируются от простых задач, таких как создание каталога, до более сложных задач, таких как выполнение преобразований XSLT. Вы не ограничены задачами, которые предоставляет Phing; Вы также можете создавать собственные задачи.
Элемент <property>
определяет именованные значения, которые можно использовать позже в файле сборки. Чтобы указать значение свойства, укажите его имя между « ${
» и « }
«. Имейте в виду, что имена свойств в Phing чувствительны к регистру.
Не обязательно указывать ваш файл сборки build.xml
, но Phing будет искать это имя по умолчанию. Если вы используете другое имя, вам нужно будет указать файл сборки в качестве аргумента команды phing
, например:
shameer @ yukon: ~ / HelloWorld $ phing hello.xml
Вы также можете вызвать цели, отличные от заданных по умолчанию, указав одно или несколько имен целей в командной строке:
shameer @ yukon: ~ / HelloWorld $ phing hello.xml target1
Несколько целей
Давайте изменим скрипт сборки и добавим дополнительные цели. В качестве примера, я предполагаю, что для проекта существует следующая структура каталогов:
Обновите build.xml
чтобы он теперь выглядел так:
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="welcome" basedir="." description="a demo project"> <property name="message" value="Hello World!"/> <property name="buildDir" value="build"/> <property name="srcDir" value="src"/> <property name="ftp.host" value="ftp.example.com"/> <property name="ftp.port" value="21"/> <property name="ftp.username" value="user"/> <property name="ftp.password" value="password"/> <property name="ftp.dir" value="/public_html/"/> <property name="ftp.mode" value="ascii"/> <target name="welcome"> <echo msg="${message}"/> </target> <target name="test"> <phpunit printsummary="true" haltonfailure="true"> <batchtest> <fileset dir="./tests"> <include name="*Test.php"/> </fileset> </batchtest> </phpunit> </target> <fileset id="srcfiles"> <include name="*"/> <exclude name="*.tmp"/> </fileset> <target name="build" depends="test"> <echo msg="Copying to build directory..."/> <copy todir="${buildDir}"> <fileset refid="srcfiles"/> </copy> </target> <ftpdeploy host="${ftp.host}" port="${ftp.port}" username="${ftp.username}" password="${ftp.password}" dir="${ftp.dir}" mode="${ftp.mode}"> <fileset refid="srcfiles"/> </ftpdeploy> </project>
Были добавлены две цели: тестирование и сборка, а цель по умолчанию была изменена на сборку. Теперь, когда вы запускаете Phing из каталога проекта, он вызывает цель build
и, поскольку эта цель зависит от цели test
, Phing сначала запустит цель test
. Задача <phpunit>
вызывает PHPUnit. Поскольку процесс сборки не должен продолжаться в случае сбоя какого-либо из модульных тестов, его <batchtest>
получает <batchtest>
файлы из любого количества вложенных элементов <fileset>
.
После успешного выполнения модульных тестов цель сборки копирует файлы, указанные в <fileset>
в каталог назначения с помощью <copy>
. Обратите внимание, что вместо указания имен файлов здесь используется refid
. Это ссылается на <fileset>
объявленный ранее с идентификатором srcfiles
. Полезно определить набор файлов и ссылаться на него следующим образом, если у вас есть сложные регулярные выражения или вам нужно ссылаться на одни и те же файлы в нескольких местах.
Задача <ftpdeploy>
подключается к удаленному серверу с использованием FTP с заданными учетными данными и передает файлы, указанные в наборе файлов.
Резюме
В этой статье я познакомил вас с инструментом сборки PHP Phing. В Phing есть гораздо больше, чем то, что я обсуждал здесь, например, вы можете использовать его для облегчения миграции баз данных . Я рекомендую прочитать отличную документацию Phing, чтобы увидеть все возможности этого мощного инструмента.
Изображение через Dino O / Shutterstock