Кто-нибудь знает, как найти и заменить текст внутри файла с помощью Phing?найти замену текста в файле Phing
ответ
Самый простой способ добиться этого, используя «традиционные» инструменты были бы sed
:
sed -i 's/old/new/g' myfile.txt
И если это муравей основе, то это должно помочь: http://ant.apache.org/manual/Tasks/replace.html
Простейшая форма будет <replace file="myfile.html" token="OLD" value="NEW"/>
.
И если вы действительно нуждаетесь в этом, вы можете запускать внешние инструменты с муравьем, как описано в http://ant.apache.org/manual/Tasks/exec.html, что означает, что среди других вещей, которые вы могли бы назвать СЭД от муравьев с чем-то вроде:
<exec executable="sed">
<arg value="s/old/new/g" />
<arg value="$MY_FILE" />
</exec>
Вы можете заменить текст внутри файлов с использованием фильтров. Фильтры используются в других задачах работы с файлами, таких как копирование.
Я считаю, что основная идея фильтров заключается в том, что вы можете иметь файлы шаблонов с токенами вместо реальных значений, а затем подставлять токены как часть процесса копирования.
Быстрый пример: есть файл шаблона конфигурации базы данных, хранящийся в каталоге шаблона. Затем скопируйте его в файл конфигурации целевой помощи:
<copy file="templates/database.config.php.tpl" tofile="config/database.config.php" overwrite="true">
<filterchain>
<replacetokens begintoken="%%" endtoken="%%">
<!-- MySQL TOKENS -->
<token key="dbname" value="${db.mysql.dbname}" />
<token key="dbhost" value="${db.mysql.host}" />
<token key="dbport" value="${db.mysql.port}" />
<token key="dbuser" value="${db.mysql.username}" />
<token key="dbpassword" value="${db.mysql.password}" />
</replacetokens>
</filterchain>
</copy>
Есть много других фильтры (например, поиск регулярных выражений и заменяющие) доступны. Подробнее о фильтрах в документации: http://phing.info/docs/guide/stable/chapters/appendixes/AppendixD2-CoreFilters.html
Это должен быть ответ. –
Я искал то же самое, и я узнал, что существует фильтр по имени ExpandProperties, который позволяет заменить свойства в скопированного файла. Например, я использовал его в апача шаблона виртуального хоста:
<target name="apache-config" description="Generates apache configuration">
<!-- Default value for Debian/Ubuntu -->
<property name="apache.vhost.dir" value="/etc/apache2/sites-available" override="false"/>
<copy file="${application.startdir}/docs/vhost.conf.tpl" todir="${apache.vhost.dir}" overwrite="true">
<filterchain>
<expandproperties/>
</filterchain>
</copy>
<echo message="Apache virtual host configuration copied, reload apache to activate it"/>
</target>
И в файле шаблона
<VirtualHost *:80>
DocumentRoot "${application.startdir}/public"
ServerName ${apache.default.host}
<Directory "${application.startdir}/public">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
В этом случае вам не нужно явно перечислить все маркеры, которые вы хотите заменить, довольно полезно ...
Я использовал вашу цепочку фильтров, но с рефлексивными задачами этого человека. – thescientist
Если вы не хотите, чтобы скопировать файлы и просто заменить строку в текущей папке, где ваши файлы проживают, сделать reflexive task:
<reflexive>
<fileset dir=".">
<include pattern="*.js" />
</fileset>
<filterchain>
<replaceregexp>
<regexp pattern="SEARCH" replace="REPLACEMENT"/>
</replaceregexp>
</filterchain>
</reflexive>
Спасибо! Этот ответ действительно лучший вариант, хотя другие имеют больше голосов на данный момент. Это как задача должна быть завершена без ненужного копирования и использования функции exec, когда доступна собственная задача phing. – AlexG
Согласен с предыдущим комментарием. Это ответ, который должен быть проголосован максимум, поскольку он фактически отвечает на вопрос, а все остальные обходные пути. – van
Я использую это на моем Phing build.xml файл
<exec command="find ./ -type f -name '*.php' | xargs sed -i 's|x--Jversion--x|${jversion}|g'" dir="${targetdir}/_package/${extname}.${package.version}" />
x - Jversion - x является заполнитель $ {jversion} - это новый текст. –
Ответ на этот вопрос дается Acme, является правильным. Если вы попытаетесь скопировать файл в себя, чтобы его изменить, крики говорят, что вы не можете само копировать.
<reflexive file="./app/config/config.yml" tofile="./app/config/config.yml">
<filterchain>
<replacetokens begintoken="__" endtoken="__">
<token key="BUILD_VERSION" value="Replace Value" />
</replacetokens>
</filterchain>
</reflexive>
Это хорошо работает для меня.
Если ваш пример вам нужен:
PHing Является ли PHP сборкой или сборкой инструмента на основе Apache Ant. Вы можете сделать что-нибудь с этим, что вы могли бы сделать с традиционной системой построения, такой как GNU make, и ее использование простых файлов XML-сборки и расширяемых классов «задач» PHP делает его простой в использовании и гибкой структурой построения. – milan
http: // phing.info/ – milan
Я пробовал тег замены, но получаю 'Не удалось создать задачу/тип: 'replace'. Убедитесь, что этот класс был объявлен с помощью taskdef/typedef. ' –