2011-02-05 2 views

ответ

2

Самый простой способ добиться этого, используя «традиционные» инструменты были бы 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> 
+0

PHing Является ли PHP сборкой или сборкой инструмента на основе Apache Ant. Вы можете сделать что-нибудь с этим, что вы могли бы сделать с традиционной системой построения, такой как GNU make, и ее использование простых файлов XML-сборки и расширяемых классов «задач» PHP делает его простой в использовании и гибкой структурой построения. – milan

+0

http: // phing.info/ – milan

+0

Я пробовал тег замены, но получаю 'Не удалось создать задачу/тип: 'replace'. Убедитесь, что этот класс был объявлен с помощью taskdef/typedef. ' –

25

Вы можете заменить текст внутри файлов с использованием фильтров. Фильтры используются в других задачах работы с файлами, таких как копирование.

Я считаю, что основная идея фильтров заключается в том, что вы можете иметь файлы шаблонов с токенами вместо реальных значений, а затем подставлять токены как часть процесса копирования.

Быстрый пример: есть файл шаблона конфигурации базы данных, хранящийся в каталоге шаблона. Затем скопируйте его в файл конфигурации целевой помощи:

<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

+0

Это должен быть ответ. –

7

Я искал то же самое, и я узнал, что существует фильтр по имени 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> 

В этом случае вам не нужно явно перечислить все маркеры, которые вы хотите заменить, довольно полезно ...

+0

Я использовал вашу цепочку фильтров, но с рефлексивными задачами этого человека. – thescientist

27

Если вы не хотите, чтобы скопировать файлы и просто заменить строку в текущей папке, где ваши файлы проживают, сделать reflexive task:

<reflexive> 
    <fileset dir="."> 
     <include pattern="*.js" /> 
    </fileset> 
    <filterchain> 
     <replaceregexp> 
      <regexp pattern="SEARCH" replace="REPLACEMENT"/> 
     </replaceregexp> 
    </filterchain> 
</reflexive> 
+1

Спасибо! Этот ответ действительно лучший вариант, хотя другие имеют больше голосов на данный момент. Это как задача должна быть завершена без ненужного копирования и использования функции exec, когда доступна собственная задача phing. – AlexG

+0

Согласен с предыдущим комментарием. Это ответ, который должен быть проголосован максимум, поскольку он фактически отвечает на вопрос, а все остальные обходные пути. – van

2

Я использую это на моем 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}" /> 
+0

x - Jversion - x является заполнитель $ {jversion} - это новый текст. –

-1

Ответ на этот вопрос дается 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> 

Это хорошо работает для меня.

+0

Если ваш пример вам нужен: CoalaWeb

Смежные вопросы