<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Phing Is Not GNU</title><html>&lt;p style=&quot;text-align: right; width: 400px; float: right; margin-right: 20px&quot;&gt;Таким образом программист может за три часа написать программу, которая сделает за пять минут то, что другой человек делал бы целый час...
© Кто-то

&lt;big&gt;&quot;Дорогая, а гладить ты умеешь?&quot;&lt;/big&gt;

Много слышал и читал про &lt;a href=&quot;http://phing.info/&quot;&gt;phing&lt;/a&gt;, но пощупать досконально нехватало времени и желания. И вот наконец моё свободное время было потрачено (и не зря) на изучение сего монстра

“Монстром” я называю phing в “хорошем” смысле этого слова - это настоящий кухонный комбайн, СВЧ-печь и стиральная машина в одном &lt;strike&gt;флаконе&lt;/strike&gt; архиве.

Что же это всё-таки такое?. &lt;a href=&quot;http://phing.info/&quot;&gt;Phing&lt;/a&gt; это &lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; воссозданный на &lt;a href=&quot;http://php.net/&quot;&gt;php&lt;/a&gt;. (Вопросы “Чё эта?” и “а нахер?” Вы можете задать непосредственно разработчикам того и другого, а я продолжу...).

Тем кто знает что такое Ant вероятнее всего phing не нужен,тем кто не знает, &lt;big&gt;но интересуется&lt;/big&gt;, могу посоветовать &lt;a href=&quot;http://www.javable.com/javaworld/10_00/03/&quot;&gt;хорошую вводную статью&lt;/a&gt;, а остальным попытаюсь объяснить вкратце суть явления.

&lt;big&gt;&quot;Но есть способ лучше!&quot;&lt;/big&gt;

В процессе разработки чего-либо возникают невероятное количество однообразных операций, которые порядком утомляют.
Как пример из  собственной практики - удаление &quot;ненужных&quot; файлов (очистка всемозможных кешей, временных файлов и т.п.), создание структуры директорий (расстановка необходимых прав доступа), удаление debug-кода из скриптов(массовый search-n-replace в определённом наборе файлов), компоновка кучи мелких &quot;инклюдов&quot; в общий файл  и много-много подобных мелочей...

Можно конечно всё сделать “вручную”.  А можно рутинную работу поручить машине. Одним из способов это сделать являются build-файлы для phing. build-файл представляет собой xml-ку в которой указан проект - совокупность задач (target-ов), которые следует выполнить, а так же последовательность (зависимость - depends в терминах phing) их выполения.
&lt;pre class=&quot;xml:nocontrols&quot;&gt;
&lt;project name=&quot;make_release&quot; basedir=&quot;..&quot; default=&quot;build&quot;&gt;
   &lt;taskdef classname=&quot;phing.tasks.ext.PhpStripCommentsTask&quot; name=&quot;phpstripcomments&quot; /&gt;
   &lt;taskdef classname=&quot;phing.tasks.ext.JsLintTask&quot; name=&quot;jslint&quot; /&gt;
   &lt;target name=&quot;clear_cache_dir&quot;&gt;
       &lt;delete&gt;
          &lt;fileset dir=&quot;cache&quot;&gt;
              &lt;include name=&quot;*&quot; /&gt;
          &lt;/fileset&gt;
      &lt;/delete&gt;
   &lt;/target&gt;
   &lt;target name=&quot;lint_before_strip&quot;&gt;
      &lt;jslint jslbinary=&quot;/usr/bin/jslint&quot; failonerror=&quot;true&quot;&gt;
          &lt;fileset dir=&quot;.&quot;&gt;
              &lt;include name=&quot;**/*.js&quot;/&gt;
              &lt;exclude name=&quot;**/.old_site/**&quot; /&gt;
          &lt;/fileset&gt;
      &lt;/jslint&gt;
    &lt;!-- skip --&gt;
    &lt;/target&gt;
    &lt;!-- ....skip --&gt;
    &lt;target name=&quot;build&quot; depends=&quot;prepare,clear_cache_dir,lint_before_strip,dump_db,copy_src,cleanup_src,remove_debugging,lint_after_strip,simpletests&quot;&gt;
    &lt;!-- skip --&gt;
        &lt;mail to=&quot;me@mydomain.tld&quot; subject=&quot;build complete&quot;&gt;
              The build process is a success...
        &lt;/mail&gt;
    &lt;/target&gt;
&lt;/project&gt;
&lt;/pre&gt;
После запуска phing начнёт выполнять default task (в примере - build), и поскольку его выполнить нельзя пока не выполнены depends, то начнёт их делать по указанному порядку... ну и на радостях отправит мне письмо (что конечно лишнее)

&lt;big&gt;&quot;Но и это ещё не всё...&quot;&lt;/big&gt;
Спектр задач которые в настоящий момент способен решать phing довольно широк (от файловых операций и строковых манипуляций, до работы с svn, simpletest и phpdoc). Для тех кому &lt;strike&gt;зазо&lt;/strike&gt; исходного набора окажется недостаточно есть замечательная возможность плодить task-и самостоятельно - просто наследуйте новый класс от базового Task и вперёд.
Мне не хватило &lt;a href=&quot;http://miracle.rpz.name/2006/09/15/javascript-lint-and-compress/&quot;&gt;jslint, jscompress&lt;/a&gt; и zndenc - на создание коих было &lt;strike&gt;бесследно&lt;/strike&gt; утрачено минут 15 драгоценного времени. В настоящий момент (ага вот прямо сейчас) обдумываю написание самого аццкого таска - ftpupload (или ftpsync).

Интересный момент - target-ы выполняются строго по порядку и если произойдёт некая непредвиденная ситуация(файл нельзя записать или например как в примере выше в проверяемом коде обнаружится синтаксическая ошибка) другие таргеты выполнятся не будут, выполнение будет прервано exception-ом. Собственно момент интересен тем что можно создавать собственный обработчик этих самых exception-ов, в которых делать &quot;правильные выводы&quot; о том стоит ли продолжать работу или смело &quot;to die if necessary...&quot;.

Другая интересная возможность - делать собственные logger-ы - потому как наблюдать за бурной рабочей деятельностью phing-а в консоли не больно удобно. В  стандартной поставки для примера  есть AnsiColorLogger, который  слегка  &quot;приукрашивает&quot; серые терминальные будни. А можно пойти дальше - складывать логи в sqlite например.

&lt;big&gt;&quot;А вы поменяете две пачки обычного порошка на одну пачку необычного?&quot;&lt;/big&gt;

Чем хорош именно phing - он написан на php5 - я могу исправить, дополнить и добавить недостающие фичи (&lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; несомненно хорош, имеет кучу готовых плагинов, но написан на java, которую я &lt;strike&gt;совсем&lt;/strike&gt; не знаю). Стандартный &lt;a href=&quot;http://www.gnu.org/software/make/&quot;&gt;(g)make&lt;/a&gt; откровенно бесит синтаксисом makefile-ов, &lt;a href=&quot;http://www.pake-project.com/&quot;&gt;pake&lt;/a&gt; (идея видимо нагло стырена с &lt;a href=&quot;http://rake.rubyforge.org/&quot;&gt;rake&lt;/a&gt;)тоже ничего &lt;strike&gt;(хорошего)&lt;/strike&gt;, но уж слишком прост и расширять его возможности довольно муторно :).
Тонна мелких и крупных shell-perl-php-cmd скриптов, которые я ранее использовал для решения сиюминутных насущных проблем тоже порядком задолбали.
Чем плох - xml как формат build-файлов (хотя на вскидку лучшего предложить ничего не могу, но &quot;аллергия&quot; на xml ещё не прошла) и написан  на php5  ;o) - скорость работы оставляет желать лучшего (18 минут на сборку,проверку и упаковку 10-ти мегабайтного проекта на мой взгляд это много).
Но &quot;удобность&quot; всё-таки решает. Так что:
&lt;blockquote&gt;$&gt; pear channel-discover pear.phing.info$&gt; pear install phing/phing&lt;/blockquote&gt;
И вперёд...

Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/dev&quot; rel=&quot;tag&quot;&gt;dev&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/build&quot; rel=&quot;tag&quot;&gt;build&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/phing&quot; rel=&quot;tag&quot;&gt;phing&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/php&quot; rel=&quot;tag&quot;&gt;php&lt;/a&gt;</html><type>rich</type></oembed>