16

ファイル内のテキストを見つけてPhingに置き換える方法を知っている人はいますか?

4

6 に答える 6

30

ファイルをコピーせずに、ファイルが存在する現在のフォルダー内の文字列を置き換えるだけの場合は、再帰的なタスクを実行します。

<reflexive>
    <fileset dir=".">
        <include pattern="*.js" />
    </fileset>
    <filterchain>
        <replaceregexp>
            <regexp pattern="SEARCH" replace="REPLACEMENT"/>
        </replaceregexp>
    </filterchain>
</reflexive>
于 2011-11-08T09:20:36.280 に答える
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

于 2011-02-06T15:36:55.260 に答える
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>

このように、置き換えたいすべてのトークンを明示的にリストする必要はありません。非常に便利です...

于 2011-07-19T11:34:09.733 に答える
2

phingbuild.xmlファイルでこれを使用します

<exec command="find ./ -type f -name '*.php' | xargs sed -i 's|x--Jversion--x|${jversion}|g'" dir="${targetdir}/_package/${extname}.${package.version}" /> 
于 2012-03-29T09:25:25.117 に答える
1

'従来の'ツールを使用してこれを実現する最も簡単な方法は次の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>
于 2011-02-05T15:56:09.820 に答える
-1

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>

これは私にとってはうまくいきます。

于 2017-01-19T13:45:09.053 に答える