2010-11-29 12 views
12

Antでソースファイル内の文字列を検索したいと思います。 (私のソースファイル内に特定の文字列が見つかった場合にビルドが失敗するようにしたい)。Antでファイル内の文字列を検索する方法(特定の文字列がソースファイル内に見つからないようにしてください)

したがって、ファイルセット内の特定の文字列を再帰的に検索できるはずです。

私はすでにloadfile taskを使用してwhether a string pattern is found within one fileをチェックできることを発見しました。しかし、それは1つのファイルでのみ有効であると思われる&。

一方、replace taskは、再帰的に検索と置換を行います。私はそれをビルドする前にそれを行うことができたと思う私の文字列をビルドを破るものと置き換えるが、いくつかクリーナーソリューションがあるのだろうか?

BR、Touko

答えて

16

これを行うには、ファイルセットselectorsを使用して検討するかもしれません。セレクタを使用すると、コンテンツ、サイズ、編集可能性などに基づいてファイルを選択できます。セレクタは、名前ベースのインクルード、除外、またはパターンセットと組み合わせることができます。

以下は例です。 2番目のファイルセットは最初のファイルセットから派生し、セレクタはファイルの内容と単純に一致します。より洗練されたマッチングのために、containsregexp selectorがあります。結果は、文字列に一致するファイルのみを含むファイルセットです。ファイルセットが空でない限り、resourcecount conditionの失敗タスクを使用してビルドが失敗します。

<property name="src.dir" value="src" /> 
<property name="search.string" value="BAD" /> 

<fileset id="existing" dir="${src.dir}"> 
    <patternset id="files"> 
     <!-- includes/excludes for your source here --> 
    </patternset> 
</fileset> 

<fileset id="matches" dir="${src.dir}"> 
    <patternset refid="files" /> 
    <contains text="${search.string}" /> 
</fileset> 

<fail message="Found '${search.string}' in one or more files in '${src.dir}'"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="matches" /> 
    </condition> 
</fail> 

旧答え):ファイルセットを調整したり、再利用する場合には問題となるかもしれませんが、ここでは比較的簡単な代替の実例です。

考えられるのは、ファイル のコピーを作成して、 を検索する文字列をコピーしたファイルのフラグ値に置き換えることです。 これは、一致するファイルの最終更新時刻を更新します。 uptodateタスクを使用して、影響を受けるファイルを探すことができます。 最後に、ファイルが一致しない限り、failのビルドが可能です。

<property name="src.dir" value="src" /> 
<property name="work.dir" value="work" /> 
<property name="search.string" value="BAD" /> 

<delete dir="${work.dir}" /> 
<mkdir dir="${work.dir}" /> 
<fileset dir="${src.dir}" id="src.files"> 
    <include name="*.txt" /> 
</fileset> 
<copy todir="${work.dir}" preservelastmodified="true"> 
    <fileset refid="src.files" /> 
</copy> 
<fileset dir="${work.dir}" id="work.files"> 
    <include name="*.txt" /> 
</fileset> 
<replaceregexp match="${search.string}" 
       replace="FOUND_${search.string}"> 
    <fileset refid="work.files" /> 
</replaceregexp> 
<uptodate property="files.clean"> 
    <srcfiles refid="work.files" /> 
    <regexpmapper from="(.*)" to="${basedir}/${src.dir}/\1" /> 
</uptodate> 
<fail message="Found '${search.string}' in one or more files in dir '${src.dir}'" 
     unless="files.clean" /> 
+0

最初の例では、ネストされたを省略し、属性「を含む」で単に「マッチ」ファイルセットを使用し多少簡潔に行うことができます。 –

+1

@EdRandallあなたは例を挙げて回答を投稿できますか – Moudiz

1

これは、スタートとして非常に有用でしたが、私は、ファイルセットにチェックすべき文字列のリストを持っています。

私の現在のSOFARされているコード:うまく機能

<property name="search4" value="XYZ"/> 

<fileset id="existing" dir="../src"> 
    <patternset id="files"> 
    <include name="content/**/*.txt"/> 
    </patternset> 
</fileset> 

<resourcecount property="count"> 
    <fileset id="matches" dir="../src"> 
    <patternset refid="files" /> 
    <contains text="${search4}" /> 
    </fileset> 
</resourcecount> 
<echo message="Found '${search4}' in files : '${count}'"/> 

が、どのようになるように$ {search4}を拡大するためには、リストから読み込まれます。実際には、各検索項目を含むファイルからリストを読み取ることができます。 @のmartinclaytonの答えの最初の部分に

0

もう少し簡潔なバリエーション:

<property name="log.dir" value="logs" /> 
<property name="fail.string" value=" FAILED " /> 

<fileset id="build.failures" dir="${log.dir}" includes="*.log"> 
    <contains text="${fail.string}"/> 
</fileset> 
<fail status="1" message="One or more failures detected"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="build.failures" /> 
    </condition> 
</fail> 
関連する問題