ファイル内のテキストを見つけてPhingに置き換える方法を知っている人はいますか?
6 に答える
ファイルをコピーせずに、ファイルが存在する現在のフォルダー内の文字列を置き換えるだけの場合は、再帰的なタスクを実行します。
<reflexive>
<fileset dir=".">
<include pattern="*.js" />
</fileset>
<filterchain>
<replaceregexp>
<regexp pattern="SEARCH" replace="REPLACEMENT"/>
</replaceregexp>
</filterchain>
</reflexive>
フィルタを使用して、ファイル内のテキストを置き換えることができます。フィルタは、コピーなどの他のファイル操作タスク内で使用されます。
フィルタの背後にある主な考え方は、実際の値の代わりにトークンを使用してテンプレートファイルを作成し、コピープロセスの一部としてトークンを置き換えることができるということだと思います。
簡単な例:データベース構成テンプレートファイルをテンプレートディレクトリに保存します。次に、以下を使用してターゲット構成ファイルにコピーします。
<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という名前のフィルターが存在することがわかりました。たとえば、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>
このように、置き換えたいすべてのトークンを明示的にリストする必要はありません。非常に便利です...
phingbuild.xmlファイルでこれを使用します
<exec command="find ./ -type f -name '*.php' | xargs sed -i 's|x--Jversion--x|${jversion}|g'" dir="${targetdir}/_package/${extname}.${package.version}" />
'従来の'ツールを使用してこれを実現する最も簡単な方法は次のsed
とおりです。
sed -i 's/old/new/g' myfile.txt
そして、それがAntベースの場合、これは役立つはずです:http: //ant.apache.org/manual/Tasks/replace.html
最も単純な形式はです<replace file="myfile.html" token="OLD" value="NEW"/>
。
また、本当に必要な場合は、http://ant.apache.org/manual/Tasks/exec.htmlに記載されているように、antを使用して外部ツールを実行できます。つまり、たとえば、からsedを呼び出すことができます。次のようなアリ
<exec executable="sed">
<arg value="s/old/new/g" />
<arg value="$MY_FILE" />
</exec>
Acmeの答えは正しいものです。ファイルを変更するためにファイルをそれ自体にコピーしようとすると、yoは自己コピーできないと叫びます。
<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>
これは私にとってはうまくいきます。