有没有人知道如何使用Phing查找和替换文件中的文本?
答案 0 :(得分:27)
如果您不想复制文件并只是替换文件所在的当前文件夹中的字符串,请执行reflexive task:
<reflexive>
<fileset dir=".">
<include pattern="*.js" />
</fileset>
<filterchain>
<replaceregexp>
<regexp pattern="SEARCH" replace="REPLACEMENT"/>
</replaceregexp>
</filterchain>
</reflexive>
答案 1 :(得分:26)
您可以使用过滤器替换文件中的文本。过滤器用于其他文件操作任务,例如copy。
我认为过滤器背后的主要思想是你可以使用带有令牌的模板文件而不是实际值,然后将令牌替换为复制过程的一部分。
快速示例:将数据库配置模板文件存储在模板目录中。然后使用以下命令将其复制到目标配置文件:
<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
答案 2 :(得分:8)
我一直在寻找相同的东西,我发现存在一个名为ExpandProperties的过滤器,它允许替换复制文件中的属性。例如,我在apache虚拟主机模板中使用它:
<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>
这样你就不需要明确列出你想要替换的所有标记,非常有用......
答案 3 :(得分: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"/>
。
如果你真的需要它,你可以运行带有ant的外部工具,如http://ant.apache.org/manual/Tasks/exec.html所述,这意味着除了其他东西之外你还可以通过以下方式调用来自ant的sed:
<exec executable="sed">
<arg value="s/old/new/g" />
<arg value="$MY_FILE" />
</exec>
答案 4 :(得分: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}" />
答案 5 :(得分:-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>
这适合我。