<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Чудо{вищные} заметки &#187; deploy</title>
	<atom:link href="http://miracle.rpz.name/tag/deploy/feed/" rel="self" type="application/rss+xml" />
	<link>http://miracle.rpz.name</link>
	<description>Sorry for my terrible english. My native language is PHP.</description>
	<lastBuildDate>Thu, 12 Jan 2012 20:42:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
		<item>
		<title>phing.tasks.ext.SvnExportRevisionDiffTask</title>
		<link>http://miracle.rpz.name/2008/02/25/phing-ftp-deploy-from-subversion/</link>
		<comments>http://miracle.rpz.name/2008/02/25/phing-ftp-deploy-from-subversion/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 17:38:25 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[phing]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=99</guid>
		<description><![CDATA[В последнее время в посещаемых мною форумах и конференциях часто всплывает тема деплоя php-приложений на production-сервер. Я решил поделиться собственным рецептом. В распоряжении имеется: svn-репозитарий с проектом. ftp-доступ к рабочему серверу. установленный и готовый к тяжёлой рутине phing Сценарий работ следующий: Сделать экспорт кода из svn Подготовить его к загрузке (например убрать комментарии, &#8220;склеить&#8221; мелкие [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время в посещаемых мною форумах и конференциях часто всплывает тема деплоя php-приложений на production-сервер. Я решил поделиться собственным рецептом.</p>
<p>В распоряжении имеется:</p>
<ol>
<li>svn-репозитарий с проектом.</li>
<li>ftp-доступ к рабочему серверу.</li>
<li>установленный и готовый к тяжёлой рутине <a href="http://phing.info">phing</a>
</li>
</ol>
<p>Сценарий работ следующий:</p>
<ol>
<li>Сделать экспорт кода из svn</li>
<li>Подготовить его к загрузке (например убрать комментарии, &#8220;склеить&#8221; мелкие в один большой, удалить лишнее и т.п.)</li>
<li>Проверить на наличие ошибок (они могли попасть в репозитарий или образоваться на предыдущем шаге)</li>
<li>Закачать полученное на рабочий сервер.
</li>
</ol>
<p>Всё вроде бы просто, но смущает один момент &#8211; экспорт всего и вся. Со времени последнего обновления на сервере в репозитарии обновились 3 файла, а экспортировать нужно всё? Никак нет! Экспортировать будем только то, что изменилось. То есть первый шаг сценария будет выглядеть так:</p>
<ol>
<li>Получить последнюю версию проекта на сервере &#8211; <i>RevFrom</i></li>
<li>Получить последнюю версию проекта в репозитарии &#8211; <i>RevTo</i>
</li>
<li>Экспортировать файлы, которые изменились или добавились c <i>RevFrom</i> до <i>RevTo</i>
</li>
</ol>
<p>Версию рабочего проекта, не мудрствуя лукаво, предлагаю хранить в текстовом файле. Например revision.txt. Версию проекта в репозитарии поможет узнать SvnLastRevisionTask. Неясным остался лишь момент &#8211; каким образом выяснить какие файлы изменились. Те, кто пользовались TortoiseSVN наверняка знают о чудесной его возможности &#8211; сравнить две ревизии и экспортировать &#8220;разницу&#8221;. Но svn в чистом виде такой возможности не предоставляет. Так что пришлось немного поработать.<br />
<span id="more-99"></span><br />
Результатом работы стал класс &#8211; <a href="http://miracle.rpz.name/shared/phing/SvnExportRevisionDiffTask.html">SvnExportRevisionDiffTask</a> Принцип его работы таков: получаю список файлов для каждой ревизии в виде xml, потом эти списки сравниваются на предмет изменившихся или добавленных файлов. Список получается путём вызова svn, т.к. более удобного способа не нашлось.</p>
<p>Закачивать файлы будем посредством task-а, который я опубликовал ранее &#8211; <a href="http://miracle.rpz.name/2007/11/15/phing-ftpupload-task/">FtpUploadTask</a>.</p>
<p>Ну вот все вроде бы в сборе и можно приступать с сборке: раскладываем php-классы в соответствующие места, берём файл example.xml</p>
<pre class="xml:nocontrols">
&lt;?xml&nbsp;version=&#39;1.0&#39;?&gt;
&lt;project&nbsp;name=&#39;Deploy&#39;&nbsp;default=&#39;build&#39;&nbsp;basedir=&#39;./&#39;&nbsp;description=&#39;Demo&nbsp;phing-ftp-deploy&#39;&gt;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name=&#39;propset&#39;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;projectUrl&#39;&nbsp;value=&#39;http://example.com/project_root/&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;revisionFile&#39;&nbsp;value=&#39;revision.txt&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;projectlastrev&nbsp;url=&#39;${projectUrl}&#39;&nbsp;revisionFile=&#39;${revisionFile}&#39;&nbsp;propertyName=&#39;fromrev&#39;&nbsp;/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;svnroot&#39;&nbsp;value=&#39;http://svn.example.com/project/branches/stable/&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;svnuser&#39;&nbsp;value=&#39;joe&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;svnpassword&#39;&nbsp;value=&#39;s3cre7&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;outputdir&#39;&nbsp;value=&#39;project-temp&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;svnlastrevision&nbsp;username=&#39;${svnuser}&#39;&nbsp;password=&#39;${svnpassword}&#39;&nbsp;repositoryurl=&#39;${svnroot}&#39;&nbsp;propertyName=&#39;torev&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;hostname&#39;&nbsp;value=&#39;ftp.example.com&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;user&#39;&nbsp;value=&#39;ftpuser@example.com&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;passwd&#39;&nbsp;value=&#39;s3cr3tk3y&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;dstdir&#39;&nbsp;value=&#39;project_root&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=&#39;overwrite&#39;&nbsp;value=&#39;true&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name=&#39;build&#39;&nbsp;depends=&#39;propset,diff,lint&#39;&gt;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ftpupload&nbsp;host=&#39;${hostname}&#39;&nbsp;username=&#39;${user}&#39;&nbsp;password=&#39;${passwd}&#39;&nbsp;targetDir=&#39;${dstdir}&#39;&nbsp;mode=&#39;bin&#39;&nbsp;overwriteExisten=&#39;${overwrite}&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset&nbsp;dir=&#39;${outputdir}&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name=&#39;**&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;exclude&nbsp;name=&#39;config.php.dist&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;exclude&nbsp;name=&#39;examples/**&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ftpupload&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name=&#39;diff&#39;&nbsp;depends=&#39;propset&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delete&nbsp;includeemptydirs=&#39;true&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;сначала&nbsp;очистить&nbsp;директорию,&nbsp;в&nbsp;которую&nbsp;будут&nbsp;экспортироваться&nbsp;файлы&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset&nbsp;dir=&#39;.&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name=&#39;${outputdir}/**&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/delete&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mkdir&nbsp;dir=&#39;${outputdir}&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;сохранить&nbsp;номер&nbsp;текущей&nbsp;ревизии&nbsp;в&nbsp;файл&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;echo&nbsp;file=&#39;${outputdir}/${revisionFile}&#39;&nbsp;message=&#39;${torev}&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;экспортировать&nbsp;нужные&nbsp;файлы&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;svndiff&nbsp;toDir=&#39;${outputdir}&#39;&nbsp;svnpath=&#39;/usr/local/subversion/bin/svn&#39;&nbsp;fromRevision=&#39;${fromrev}&#39;&nbsp;toRevision=&#39;${torev}&#39;&nbsp;force=&#39;true&#39;&nbsp;username=&#39;${svnuser}&#39;&nbsp;password=&#39;${svnpassword}&#39;&nbsp;repositoryurl=&#39;${svnroot}&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name=&#39;lint&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;phplint&nbsp;haltOnFailure=&#39;true&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset&nbsp;dir=&#39;${outputdir}&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name=&#39;**/*.php&#39;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;файлы&nbsp;в&nbsp;pear::php_compat&nbsp;проверять&nbsp;в&nbsp;php5&nbsp;не&nbsp;надо&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;exclude&nbsp;name=&#39;**/Php/Compat/**/*.php&#39;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/phplint&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jslint&nbsp;haltOnFailure=&#39;true&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset&nbsp;dir=&#39;${outputdir}&#39;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name=&#39;**/*.js&#39;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/jslint&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;
&lt;/project&gt;
</pre>
<p>Открываем консоль, набираем <b>phing -f example.xml </b> и смотрим как вашу работу выполняет за вас бездушная машина&#8230; </p>
<blockquote><p>
Кстати говоря, эту задачу можно запускать не только вручную, но и например с помощью post-commit hook-а на репозитарии&#8230;
</p></blockquote>
<p>
Данный сценарий не затрагивает изменений в БД и позволяет синхронизировать только файлы, но и это, согласитесь, уже кое-что. А быть может у вас есть идеи, как обновить БД?</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/02/25/phing-ftp-deploy-from-subversion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>phing.tasks.ext.FtpUploadTask</title>
		<link>http://miracle.rpz.name/2007/11/15/phing-ftpupload-task/</link>
		<comments>http://miracle.rpz.name/2007/11/15/phing-ftpupload-task/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 20:40:44 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[phing]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=78</guid>
		<description><![CDATA[Вычищая комментарии от спама (достали, честное октябрятское) наткнулся на незаслуженно позабытый вопрос товарища altern-a про обещанный ftpupload-таск. Вы спросили &#8211; мы ответили: нет, мне не сложно &#8211; делюсь. Собственно сам класс FtpUploadTask.php. И небольшие пояснения. Код по означенной ссылке необходимо сохранить в файл %PHING_HOME%/classes/phing/tasks/ext/FtpUploadTask.php (Разумеется вы уже знаете что такое Phing и он у вас [...]]]></description>
			<content:encoded><![CDATA[<p>Вычищая комментарии от спама (достали, честное октябрятское) наткнулся на <a href="http://miracle.rpz.name/2006/09/20/phing-is-not-gnu/#comments">незаслуженно позабытый вопрос</a> товарища <a href="http://altern.ho.com.ua/">altern</a>-a про обещанный ftpupload-таск. Вы спросили &#8211; мы ответили: нет, мне не сложно &#8211; делюсь.</p>
<p>Собственно сам класс <a href="http://miracle.rpz.name/shared/phing/FtpUploadTask.html">FtpUploadTask.php</a>. И небольшие пояснения.</p>
<p>Код по означенной ссылке необходимо сохранить в файл %PHING_HOME%/classes/phing/tasks/ext/FtpUploadTask.php (Разумеется вы уже знаете что такое <a href="http://phing.info/">Phing</a> и он у вас установлен и готов к использованию).<br />
Для работы требуется установленный в include_path <a href="http://pear.php.net/package/Net_FTP/">PEAR::Net_FTP</a>, которому в свою очередь необходим <a href="http://php.net/ftp">php-extension FTP</a>.</p>
<blockquote><p><strike>На заметку виндузятникам</strike><br />
<i>Первое можно установить посредством выполнения магического пасса в командной строке:<br />
&gt;pear install &#8211;all-deps net_ftp<br />
Второе в виндовом php уже вкомпилено.</i></p></blockquote>
<p>Параметры, которые принимает task (на всякий случай на моём террибл инглиш ):</p>
<table class="std">
<thead>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
<th>Required</th>
</tr>
<tr>
<td>host</td>
<td>String</td>
<td>Hostname.</td>
<td>n/a</td>
<td>Yes</td>
</tr>
<tr>
<td>port</td>
<td>Integer</td>
<td>Ftp server&#8217;s port.</td>
<td>21</td>
<td>No</td>
</tr>
<tr>
<td>username</td>
<td>String</td>
<td>Ftp user</td>
<td>n/a</td>
<td>Yes</td>
</tr>
<tr>
<td>password</td>
<td>String</td>
<td>Ftp password</td>
<td>n/a</td>
<td>Yes</td>
</tr>
<tr>
<td>targetDir</td>
<td>String</td>
<td>Path to destination directory</td>
<td>. (FTP-user&#8217;s home)</td>
<td>No</td>
</tr>
<tr>
<td>mode</td>
<td>String</td>
<td>Upload FTP-mode.</td>
<td>Binary</td>
<td>No</td>
</tr>
<tr>
<td>cleanDir</td>
<td>Boolean</td>
<td>Cleanup target directory before upload?</td>
<td>False</td>
<td>No</td>
</tr>
<tr>
<td>overwriteExisten</td>
<td>Boolean</td>
<td>Overwrite existen files?</td>
<td>True</td>
<td>No</td>
</tr>
<tr>
<td>passiveMode</td>
<td>Boolean</td>
<td>use passive or active ftp-data connection</td>
<td>True</td>
<td>No</td>
</tr>
</table>
<p>И пример использования : привожу часть build.xml необходимую и достаточную для запуска таска.</p>
<pre class="xml:nocontrols">
&lt;!-- //skip --&gt;
&lt;taskdef classname="phing.tasks.ext.FtpUploadTask" name="ftpupload" /&gt;
&lt;!-- //skip --&gt;
&lt;target name="deploy"&gt;
   &lt;ftpupload host="example.com" username="joe" password="$ecr3t" targetDir="/remote/project_home/"&gt;
      &lt;fileset dir="/path/to/local/project"&gt;
         &lt;include name="**" /&gt;
         &lt;exclude name="**/*.dist" /&gt;
         &lt;exclude name="src/*" /&gt;
      &lt;/fileset&gt;
   &lt;/ftpupload&gt;
&lt;/target&gt;
&lt;!-- //skip --&gt;
</pre>
<p>Разумеется taskdef удобнее перенести в defaults.properties, для того чтобы не таскать его из проекта в проект.</p>
<p>И снова повторюсь &#8211; &#8220;таким образом программист может за три часа написать программу, которая сделает за пять минут то, что другой человек делал бы целый час…&#8221;  ;o)</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/php" rel="tag">php</a>, <a href="http://technorati.com/tag/phing" rel="tag">phing</a>, <a href="http://technorati.com/tag/deploy" rel="tag">deploy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2007/11/15/phing-ftpupload-task/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: miracle.rpz.name @ 2012-02-06 18:03:18 by W3 Total Cache -->
