2011-02-05 23 views

答えて

2

「伝統的」なツールを使ってこれを実現する最も簡単な方法は、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"/>だろう。

そして、あなたが本当にそれを必要とする場合は、のようなものでアリからsedを呼び出すことができ、他のものの間であることを意味し、http://ant.apache.org/manual/Tasks/exec.htmlで説明したように、あなたはアリで外部ツールを実行することができます:

<exec executable="sed"> 
    <arg value="s/old/new/g" /> 
    <arg value="$MY_FILE" /> 
</exec> 
+0

PHing Apache AntをベースにしたPHPプロジェクトビルドシステムまたはビルドツールです。 GNU makeのような伝統的なビルドシステムでできることは何でもできるし、単純なXMLビルドファイルや拡張可能なPHPの "task"クラスを使うことで、使いやすく柔軟性の高いビルドフレームワークができます。 – milan

+0

http:// phing。info/ – milan

+0

私はreplaceタグを試しましたが、 'タスクを作成できませんでした/タイプ: '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というフィルタが存在することがわかりました。たとえば、私は、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> 

この方法であなたはかなり、明示的に交換したいすべてのトークンをリストする必要はありません便利な...

+0

私はあなたのフィルターチェーンを使用しましたが、上記人の反射的な仕事をしました。 – thescientist

27

あなたはreflexive taskを行う、ファイルをコピーし、ちょうどあなたのファイルが存在する現在のフォルダ内の文字列を置換したくない場合は、次の

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

ありがとう!この回答は実際には最良の選択肢ですが、他の人はこの時点でより多くの票を得ています。これは、不要なコピーを行わずにタスクを完了させ、ネイティブのphingタスクが利用可能なときにexecタスクを使用する方法です。 – 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

アクメによって与えられた答えにこれを使用し、正しいものです。 ファイルを変更するためにファイルを自分自身にコピーしようとすると、自己コピーできないことを伝えます。

<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

関連する問題